只要在mui.back()的判断上面加上逻辑代码,好像localStorage.setItem这样的,就无法返回了,但是不加 就可以返回,主要的是想把子页面的数据携带到父页面,要怎么做呢?请大神指教
- 发布:2017-05-12 11:42
- 更新:2019-04-11 15:47
- 阅读:4664
chender - 与人为善
再mui.back里面调用localstorage.setItem肯定是可以正常返回的,但是返回后上一个页面也是感知不到的,不会去取这个数据,这种场景下,你可以在上一个页面里监听新页面的隐藏事件,在事件处理里去取这个参数;
也可以在mui.back里面通过fire事件机制或者evaljs机制去通知上一个页面
chender - 与人为善
重写mui.back不能直接
mui.back=function(){
xxx
}
需要这样
var oldBack=mui.back;
mui.back=function(){
xxxxx;
oldBack();
}
或者你不重写mui,back,直接重写mu.beforeBack
-
D调 (作者)
谢谢大佬,但是重写mui.back还是返回不了,重写beforeBack可以返回,但是用localStorage.setItem就是值获取不到,是null
2017-05-12 16:08
-
D调 (作者)
这是我父页面的,也有用localStorage.setItem传值,在子页面可以获取到
mui.openWindow({
url : 'second.html',
id : 'second.html'
});
这是我子页面的异步方法成功后去执行的
if(msg=="保存成功"){
var oldBack = mui.beforeBack;
mui.beforeBack = function(){
localStorage.setItem('tname',tname);
oldBack();
}
mui.back();
}
然后在父页面再这样获取
var tname = localStorage.getItem('tname');
$('#tname').text(tname);
mui.toast("tname是"+tname);
然后获取的值是空的,请大佬过目2017-05-12 16:23
-
第一,确认一下msg是否等于"保存成功";
第二,你父页面中再次获取是怎么触发的,通过界面点击触发的吗?
第三,实在不行你就换成evalJs的方式,肯定能行,在父页面里定义一个方法
function receivename(name){
mui.toast("tname是"+tname);
}
然后子页面里在mui,back里面通过父页面的id拿到父页面的webview,然后evalJs("receivename('"+tname+"')")
另外,我看你的代码逻辑应该是异步方法成功后,就自动返回父页面吧,这样的话你不用去重写beforeBack,直接在调用mui.back之前setitem就行了2017-05-12 16:43
-
D调 (作者)
第一,msg是保存成功
第二,子页面返回后父页面是要重新加载的吧?就是mui.back()后直接加载父页面获取到的值
“通过父页面的id拿到父页面的webview”这一步是怎么做的?我的js比较水2017-05-12 16:56
D调 (作者)
大佬看下
-
我看了一下代码,返回只有,first页面应该是感知不到的啊,js也不会重写执行一遍
你可以在second页面里通过plus.webview.currentWebview.opener()获取到first页面的webview,然后执行evalJs2017-05-12 17:47
-
可以这么理解,mui是,mui.js里面的对象,所有引用mui.js后就能调用mui的任何方法,访问他的任何属性,plus是在5+的环境准备好后,由原生代码注入进来的一个js对象,注入进来后会痛plusready事件通知页面,mui提供了plusReady这个方法进行该事件的监听
2017-05-15 11:24
-
D调 (作者)
回复 chender:但是我这样用之后,页面可以返回,还是无法取到值
子页面
if(msg=="抬头保存成功"){
mui.plusReady(function(){
var view = plus.webview.currentWebview.opener();
view.evalJs("receivename('"+invoiceid+"')");
});
mui.back();
父页面
<input type="text" id="invoiceid" name="invoiceid"/>
父页面的js,在mui.ready外定义的
function receivename(invoiceid){
$("#invoiceid").text(invoiceid);
}2017-05-15 14:19
-
1、改成这样:
if(msg=="抬头保存成功"){
var view = plus.webview.currentWebview.opener();
view.evalJs("receivename('"+invoiceid+"')");
mui.back();
因为你ajax返回的时候页面早都已经plusReady过了,plusReady是为了解决代码执行时机的问题,类似jquery的$(document).ready
如果还不行的话,你就console.log多打点日志吧,看是执行到哪里断了2017-05-15 16:55
-
那不应该啊。。再你回调的时候,肯定plus已经注入进来了,写不写plusReady都无所谓了, 你直接js的第一句写上mui.plusReady(function(){alert(plus)});看弹出来的是什么;
2017-05-16 10:39
1***@163.com - 行走即是圆梦,回去亦是前行,追梦ing
首先,plus必须是真机测试,plus就是指的手机,
然后,下面是子界面的方法,我这里是返回对象,sureBtn是按钮id
$$("#sureBtn").on('tap', function() {
var data={};
data.c_cmdid='12';
data.flagAdress='浙江省杭州市';
data.flagNum='NUMS_0012';
//获得父页面的webview
var list = plus.webview.currentWebview().opener();
//触发父页面的自定义事件(selectSF),从而进行逻辑处理
mui.fire(list,'selectSF',data);
mui.back();
}
其次,下面是父界面接收过来的参数,添加一个监听事件即可,注意的是所有监听事件都是需要在预加载完成后才会触发,所以监听事件需要放到mui.plusReady里面
mui.plusReady(function(){
window.addEventListener('selectSF', function(e){
$$("#c_ex21").val(e.detail.c_cmdid);//id
$$("#c_ex22").val(e.detail.flagAdress);//地址
$$("#c_ex23").val(e.detail.flagNum);//编号
});
}
最后,提示一下,如果想返回多层父亲界面,而且还带参数的话,这种方法也是有效的
D调 (作者)
没太能理解,我是刚接触mui,我在mui.back前面用了localstorage.setItem后,mui.back失效了没有返回父页面,我看了很多:但是我试过还是无法返回,请指教
例子
这是子页面
var indexPage=plus.webview.getLaunchWebview();//获取首页对象
console.log(indexPage);
mui.fire(indexPage,'backIndexPage',{str:"我回来了!"});
mui.back();
浏览器会报“plus 未定义”的错
父页面
document.addEventListener('backIndexPage', function(ee) {
document.getElementById("sss").innerText = ee.detail.str;
})
2017-05-12 15:12
chender
那是因为plus还未初始化,把代码写在mui.plusReady里面吧
2017-05-12 15:14