情况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携带的两个参数成功的显示在了导航栏标题上。
情况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回调函数,等待点击地图上的某个锚点触发该回调函数的执行。
效果如下:
情况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岁
情况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();
}