D调
D调
  • 发布:2017-05-12 11:42
  • 更新:2019-04-11 15:47
  • 阅读:4448

用mui.back()返回到父页面的时候可以携带参数返回到父页面吗?

分类:MUI
mui

只要在mui.back()的判断上面加上逻辑代码,好像localStorage.setItem这样的,就无法返回了,但是不加 就可以返回,主要的是想把子页面的数据携带到父页面,要怎么做呢?请大神指教

2017-05-12 11:42 负责人:无 分享
已邀请:
chender

chender - 与人为善

再mui.back里面调用localstorage.setItem肯定是可以正常返回的,但是返回后上一个页面也是感知不到的,不会去取这个数据,这种场景下,你可以在上一个页面里监听新页面的隐藏事件,在事件处理里去取这个参数;
也可以在mui.back里面通过fire事件机制或者evaljs机制去通知上一个页面

  • 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

chender

chender - 与人为善

写了localstorage.setItem后不能返回的原因是:
不是localstorage,应该是localStorage

  • D调 (作者)

    我只是从别的代码拷过来的,我第一条是大写的。mui.back前面有localStorage.setItem之类的设值或者移除值的情况都不能返回


    2017-05-12 15:46

chender

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

  • chender

    回复 D调:如果你的两个页面是跨域的话,用js的localStorage是不行的,你可以用plus.localStorage


    2017-05-12 16:10

  • D调 (作者)

    没有跨域,两个页面都是同级的


    2017-05-12 16:13

  • chender

    不科学,你把代码都贴出来


    2017-05-12 16:15

  • 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

  • chender

    第一,确认一下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调 (作者)

    plus.webview.getWebviewById,但是我的父窗口没有id的怎么给父窗口一个id?


    2017-05-12 16:57

  • chender

    回复 D调:你用a页面打开了b页面,然后b页面返回,这个时候a页面数不会刷新的哦,创建父页面的时候可以指定一个id


    2017-05-12 17:02

  • D调 (作者)

    回复 chender:通过哪个方法给?但是没有刷新,应该会重新加载js吧,都重新提示为空


    2017-05-12 17:06

  • chender

    回复 D调:理论上父页面是不会做任何事情的,你把这两个页面的代码附件传上来吧,应该还是哪里逻辑的问题哈


    2017-05-12 17:14

  • D调 (作者)

    回复 chender:我上传了,大佬请看下


    2017-05-12 17:35

D调

D调 (作者)

大佬看下

  • chender

    我看了一下代码,返回只有,first页面应该是感知不到的啊,js也不会重写执行一遍

    你可以在second页面里通过plus.webview.currentWebview.opener()获取到first页面的webview,然后执行evalJs


    2017-05-12 17:47

  • D调 (作者)

    回复 chender:这个plus是不需要定义的吗?


    2017-05-14 16:01

  • chender

    回复 D调:plus在plus.ready之后就能直接用了,是注入进来的js对象


    2017-05-15 09:14

  • D调 (作者)

    回复 chender:plusReady是在mui.init后使用,替换mui.ready吗,我试过用plusReady,然后整个js都访问不了了


    2017-05-15 09:29

  • D调 (作者)

    回复 chender:plusReady是在mui.init后使用,替换mui.ready吗,我试过用plusReady,然后整个js都访问不了了


    2017-05-15 10:45

  • chender

    mui.plusReady(function(){

    再这之后就能用plus了

    });


    2017-05-15 10:48

  • D调 (作者)

    回复 chender:恩恩,但是这个mui.plusReady定义的位置应该是在哪里呢


    2017-05-15 10:52

  • D调 (作者)

    回复 chender:还有一个问题,就是重写mui.back之后,调用oldBack是在重写方法内部去调用吗?


    2017-05-15 10:53

  • chender

    在引入了mui.js之后都可以调用


    2017-05-15 10:53

  • D调 (作者)

    回复 chender:所以引用mui.plusReady跟使用mui.back是一样的,在mui.ready里面的任何位置都可以用的?


    2017-05-15 11:02

  • chender

    可以这么理解,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

  • chender

    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

  • D调 (作者)

    回复 chender:用这种方式,控制台报错就是ReferenceError: plus is not defined,这个plusReady不知道在什么位置定义比较好


    2017-05-16 00:34

  • chender

    你上面那段代码是在页面加载的时候就会执行?不是通过点击页面元素触发的?


    2017-05-16 09:00

  • D调 (作者)

    回复 chender:是在点击保存按钮的时候,我的保存按钮还有个异步方法,那是放在异步方法成功后还是在异步方法之前呢?


    2017-05-16 09:18

  • chender

    是在点击了保存按钮后,报的ReferenceError: plus is not defined?


    2017-05-16 10:05

  • D调 (作者)

    回复 chender:是呀,所以我才不知道该把plusReady定义在什么位置


    2017-05-16 10:32

  • chender

    那不应该啊。。再你回调的时候,肯定plus已经注入进来了,写不写plusReady都无所谓了, 你直接js的第一句写上mui.plusReady(function(){alert(plus)});看弹出来的是什么;


    2017-05-16 10:39

  • D调 (作者)

    回复 chender:我放在最顶和第二行都没反应

    mui.init();

    mui.plusReady(function(){alert(plus)});

    mui.ready(function() {


    2017-05-16 10:43

  • chender

    额,不是吧,难道你不是在手机上测的?


    2017-05-16 10:55

  • D调 (作者)

    回复 chender:不是。。。我在pc上测试的。。。


    2017-05-16 10:57

  • chender

    。。。pc上哪里来的plus,我就说怎么回事,各种不对劲。。。pc上不得行哈,要在手机上弄


    2017-05-16 11:03

  • D调 (作者)

    回复 chender:非常感谢大佬的指引


    2017-05-16 11:58

1***@163.com

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);//编号
});
}
最后,提示一下,如果想返回多层父亲界面,而且还带参数的话,这种方法也是有效的

该问题目前已经被锁定, 无法添加新回复