apiCloud的execScript详细用法(4种情景公司项目全部使用到了)

情况1。 在当前window中执行jsfun脚本。

例如:在window A 中打开了frame B。如果 frame B 向window A中传值,execScript中不用写frameName和name。在frame B界面打印api.winName可知,frame B的window就是window A 的名字。所以A和B的window都是A。
var jsfun = "updateTopNavTitleCallBack();";
api.execScript({
script: jsfun
});

情况1代码如下
  • 在person_sign.html页面,以openWin的方式打开了名为hunting_sure_pay的window,
api.openWin(
    {
         name: "hunting_sure_pay",
         url: "hunting_sure_pay.html",
         pageParam:{
             vip_id:ret.data,
             type: type,
         }
  });
  • hunting_sure_pay.html的window页面:openFrame的方式打开了名为hunting_sure_pay_frm的frame,并写了updateTopNavTitleCallBack回调函数,等待frame界面触发该回调函数
function initView() {
  var header = $api.byId('header');
        $api.fixStatusBar(header);
        headerH = $api.offset(header).h;
        api.openFrame({// 打开名为hunting_sure_pay_frm的frame
            name: 'hunting_sure_pay_frm',
            url: 'hunting_sure_pay_frm.html',
            rect: {
                x: 0,
                y: 45 + api.safeArea.top,
                w: 'auto',
                h: api.frameHeight - api.safeArea.top - 45
            },
            bounces: true,
            pageParam: {
                vip_id:api.pageParam.vip_id,
                type:api.pageParam.type,
            },
            reload: true,
            bgColor: 'rgba(0,0,0,0)',
            vScrollBarEnabled: true,
            hScrollBarEnabled: true
        });
}
// 回调函数执行
function updateTopNavTitleCallBack(parameter1,parameter2) {
      $("#title").html(parameter1 + parameter2);
}
  • hunting_sure_pay_frm.html的frame界面:定义参数为name和work的回调函数。
function getUserVipTrade() {
    var name = "CoderZB";
    var work = "666";
    var jsfun = "updateTopNavTitleCallBack('" + name + "','" + work + "');";
    console.log("当前window为" + api.winName);// 打印得知,window名为hunting_sure_pay
    api.execScript({
        script: jsfun
    }); 
}         

效果如下:updateTopNavTitleCallBack携带的两个参数成功的显示在了导航栏标题上。

image.png

情况2。在当前window中找到名为point_address_list_frm的frame,并在该frame中执行jsfun脚本

例如:在window A 中打开了frame B。如果 window A 向 frame B中传值,execScript中一定要写frameName,不用写name(你想多此一举写name的话也可以,但一定要写对,写window A的名字,否者无法传值)。
事例详细解释:window A 是个地图,frame B是列表数据,列表数据来源于 点击window A 地图上的某个点,由A传给B的。所以一次性的A给B传值可以采用openFrame携带参数的方式。但是多次点击地图的某个点的话,如果还采用这种方式的话,那么每次openFrame的同时都要配置reload:true,来达到刷新整个列表的所有代码,否则携带的参数总是第一次的参数。所以最好采用脚本的方式,每点击一次就声明一次回调函数
var jsonArray = JSON.stringify(result.poiList.pois);
var jsfun = "getListDataPostCallBack("+ jsonArray +");";
api.execScript({
frameName:"point_address_list_frm",
// name:"js_select_location",
script: jsfun
});

情况2代码如下
  • 在message_talk_person_bot_frm.html页面,以openWin的方式打开了名为js_select_location的window,
  api.openWin({
            name: 'js_select_location',
            url: '../layer/js_select_location.html',
            slidBackEnabled: 'false',
            pageParam: {
                methodName: "getPreData()"
            } //要接收返回数据的方法名
 });
  • js_select_location.html的window页面:openFrame的方式打开了名为point_address_list_frm的frame,并在该页面定义了参数为jsonArray的getListDataPostCallBack回调函数。
  api.openFrame({
    name: 'point_address_list_frm',
    url: './point_address_list_frm.html',
    rect: {
        x: 12,
        // frame的Y值在导航栏下方
        y: api.winHeight - 420,
        w: api.winWidth - 24,
        // frame的高度为屏幕的高度减去导航栏的高度
        h: 415
    },

    // 跳页传参
    pageParam: {
        listData: '',
        methodName:api.pageParam.methodName//要接收返回数据的方法名
    },
    bounces: false,
    bgColor: 'rgba(0,0,0,0)',
    vScrollBarEnabled: true,
    hScrollBarEnabled: true
    });

// 点击地图上的某个点就会调用更新锚点,更新列表数据
function updateListData(lng,lat,type){
      AMap.service(["AMap.PlaceSearch"], function() {

        if (!placeSearch) {// 懒加载
          // 构造地点查询类
           placeSearch = new AMap.PlaceSearch({
              type: service_type, // 兴趣点类别
              pageSize: 4, // 单页显示结果条数
              pageIndex: 1, // 页码
              city: "", // 兴趣点城市
              citylimit: true,  //是否强制限制在设置的城市内搜索
              map: map, // 展现结果的地图实例
              panel: "", // 结果列表将在此容器中进行展示。
              autoFitView: false // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
          });
        }
        var cpoint = [lng,lat]; //中心点坐标   116.405467, 39.907761
        placeSearch.searchNearBy(topSearchKeyWord, cpoint,1000, function(status, result) {
           if(result.info){// 获取到锚点附近数据了
              showPointAddressList();
           
              
              var jsonArray = JSON.stringify(result.poiList.pois);
            // 定义回调函数
              var jsfun = "getListDataPostCallBack("+ jsonArray +");";
              api.execScript({
                  frameName:"point_address_list_frm",
                  // name:"js_select_location",// 可写可不写
                  script: jsfun
              });

          }else{
              console.log("没有数据");
              api.toast({
                  msg: "本次没有搜索到数据",
                  duration: 2000,
                  location: 'middle'
              });
            }
        });
    });
}
  • point_address_list_frm.html的frame界面:写了getListDataPostCallBack回调函数,等待点击地图上的某个锚点触发该回调函数的执行。

效果如下:

101.175521.gif

情况3。 在名为resume_edit的window中执行jsfun脚本

例如:在window A 中打开了window B。如果 window B 向window A中传值,那么window B中的execScript中不用写frameName,只写name。
var jsFun = 'updateResumeTopCallBack();';
api.execScript({
name:api.pageParam.name,
script: jsFun
});

情况3代码如下
  • 在my_employee_frm.html页面,以openWin的方式打开了名为resume_edit的window
// 我的简历编写
function myResumeFill() {
  api.openWin({
      name: 'resume_edit',
      url: '../resume/resume_edit.html',
  });
}
  • resume_edit.html的window页面:openWin的方式打开了名为basic_message的window,并写了updateResumeTopCallBack回调函数,等待basic_message的window界面触发该回调函数
// 编辑按钮事件
function onEdit() {
  // console.log("api.frameName为" + api.frameName + "api.winName为" + api.winName);
    api.openWin({
        name: 'basic_message',
        url: '../basic_message.html',
        pageParam: {
            name: api.winName,
            fromWhere:"我的简历",
        }
    });
}


function updateResumeTopCallBack() {
    console.log("更新顶部简历回调了");
    // 基本信息获取
    baseInfoGet();
    // 仅仅为了获取到简历id
    baseDetailInfoGet();
}

  • basic_message.html的window界面:定义名为updateResumeTopCallBack的回调函数。
function saveDetailInfo(){

    xxxxx保存信息的ajax请求成功的相关代码这里就不写了xxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    // 保存信息成功之后,如果fromWhere等于我的简历,就定义updateResumeTopCallBack回调函数。
    if(fromWhere == "我的简历"){
        var jsFun = 'updateResumeTopCallBack();';
        api.execScript({
             name:api.pageParam.name,
             script: jsFun
        });
     }
     api.closeWin();
}

效果如下:基本信息界面修改了出生年份,保存并返回上个界面,然后出发updateResumeTopCallBack函数,从而刷新我的简历界面,获取最新的个人基本信息。直观的效果:年龄由30岁变成了17岁

101.175522.gif

情况4。【跨window传值,给frame传值】在名为winName的window中找到名为frmName的frame,并在该frame中执行jsfun脚本

例如:在window A中openFrame了frame A。然后frame A中openWin了window B,然后window B中openFrame了frame B。本质上就是frame B向frame A传递了数据,但是frame B所属的window和frame A所属的window不是一个window。这就是跨window传值,给frame传值。那么frame B中的execScript中frameName和name都要写,缺一不可。
var jsfun = 'changePhoneCallBack();';
api.execScript({
frameName:api.pageParam.name,
name:api.pageParam.win_name,
script: jsfun
});

情况4代码如下
  • 在my_employee_frm.html页面,以openWin的方式打开了名为my_setting的window
api.openWin({
  name: 'my_setting',
  url: 'my_setting.html',
});
  • my_setting.html的window页面:openFrame的方式打开了名为my_setting_frm的frame
function initView() {
  var nav = $api.byId("nav");
   $api.fixStatusBar(nav);
  // 获取导航栏的高度
  var navH = $api.offset(nav).h;
    api.openFrame({
      name: 'my_setting_frm',
      url: 'my_setting_frm.html',
      rect: {
          x: 0,
          // frame的Y值在导航栏下方
          y: navH,
          w: "auto",
          // frame的高度为屏幕的高度减去导航栏的高度
          h: api.winHeight-navH
      },
      bounces: false,
      bgColor: 'rgba(0,0,0,0)',
      vScrollBarEnabled: true,
      hScrollBarEnabled: true
  });
}
  • my_setting_frm.html的frame页面:openWin的方式打开了名为change_phone的window。并写了带有参数的changePhoneCallBack回调函数,等待change_phone_frm的frame界面触发该回调函数
function bindPhone(){
  console.log("当前frame为" + api.frameName + "当前win为" + api.winName);
  api.openWin({
    name: 'change_phone',
    url: 'change_phone.html',
    pageParam: {
        name: api.frameName,
        win_name:api.winName,
    }
  });
}
// 更改手机号成功后的回调
function changePhoneCallBack(obj) {
    $('a#phone').prop('firstChild').nodeValue = obj;
}
  • change_phone.html的window页面:openFrame的方式打开了名为change_phone的window
function initView() {
var nav = $api.byId("nav");
 $api.fixStatusBar(nav);
// 获取导航栏的高度
var navH = $api.offset(nav).h;
  api.openFrame({
    name: 'change_phone',
    url: 'change_phone_frm.html',
    rect: {
        x: 0,
        // frame的Y值在导航栏下方
        y: navH,
        w: "auto",
        // frame的高度为屏幕的高度减去导航栏的高度
        h: api.winHeight-navH
    },
    // 跳页传参
    pageParam: {
        nameScreenH: api.winHeight,
        nameNavH: navH,
        name:api.pageParam.name,
        win_name:api.pageParam.win_name,
    },
    bounces: true,
    bgColor: 'rgba(0,0,0,0)',
    vScrollBarEnabled: true,
    hScrollBarEnabled: true
});
}

  • change_phone_frm.html的frame页面:定义参数为name和work的回调函数。
// 更换手机号
function changeMobile() {
  var mobileData  = $("#mobile").val();
  // 回调函数
  var jsfun = 'changePhoneCallBack('+mobileData+');';
  api.execScript({
    frameName:api.pageParam.name,
    name:api.pageParam.win_name,
    script: jsfun
  });
  comeBack();
}
101.175523.gif

你可能感兴趣的:(apiCloud的execScript详细用法(4种情景公司项目全部使用到了))