apche
apche
  • 发布:2015-09-28 17:49
  • 更新:2018-07-20 10:09
  • 阅读:32251

evalJS和自定义事件,在ios 下不执行?

分类:MUI

test.zip 使用最新的版本新建的项目,从a.html 跳转到b.html后执行一段代码,下面是关键部分:

var webview=mui.preload({  
    url:'b.html',  
    id:'page-login'  
});  
//var webview=plus.webview.create('b.html','b.html');         
webview.show('none', 1, function() {  
    console.log(1221);  
    webview.evalJS("test()");  
    mui.fire(webview, 'pageShow', {});  
});     

在android 中没有问题,但是在ios 系统方法不执行,我使用的iphone 5 ios 8.4.1

2015-09-28 17:49 负责人:无 分享
已邀请:
DCloud_UNI_CHB

DCloud_UNI_CHB

webview必须触发loaded事件后,才能执行evalJS或mui.fire方法;

将你示例a.html页面代码中增加loaded事件监听,即可解决问题:

webview.addEventListener('loaded',function () {  
    webview.show('none', 1, function() {  
        console.log(1221);  
        webview.evalJS("test()");  
        mui.fire(webview, 'pageShow', {});  
    });  
})
  • Miaosem

    为什么我用 webview=mui.preload 然后监听webvie的loaded 可以执行webview.evalJS,但若是使用 webview=plus.webview.create 然后监听webvie的loaded 就执行不了webview.evalJS 显示错误【Uncaught TypeError: Cannot call method 'evalJS'

    mui.preload 与 plus.webview.create 在loaded上是不是有什么区别


    for (var i = 0; i < 4; i++) {

    var temp = {};

    var sub = plus.webview.create(subpages[i], subpages[i], subpage_style);

    if (i > 0) {

    sub.hide();

    }else{


    sub.addEventListener('loaded', function() {

    setTimeout(function() {


    mui("#addhome")[0].addEventListener("tap",function(){

    var obj=plus.webview.getWebviewById("tab-webview-subpage-about");

    obj.evalJS('mui("#topPopover").popover("toggle")');

    });


    }, 50);


    });

    temp[subpages[i]] = "true";

    mui.extend(aniShow,temp);

    }

    self.append(sub);

    }

    2015-12-25 12:08

  • 3***@qq.com

    那有可能create方法是异步的

    2016-05-26 15:36

  • 前端菜鸟哟

    Uncaught ReferenceError: webview is not defined 这样报错该怎么办

    2017-03-21 14:26

  • DCloud_UNI_CHB

    回复 前端菜鸟哟:说明webview未定义啊,检查一下你的代码

    2017-03-21 18:52

00飞00

00飞00 - 全栈 云原生

或者你可以这样:

在a.html页面js中,

//要先预加载 b页面
mui.preload({
url: 'b.html',
id: 'pageB'
});

//根据预加载好的 b页面的 webVIew id 获取B页面的 webview
var pageB= plus.webview.getWebviewById('pageB');

//fire事件会在打开b页面后,执行B页面的 showPageB事件
//showPageB 这个是自己定义的 函数名称
mui.fire(pageB, 'showPageB', {});

在b.html 页面的js中,
mui.plusReady(function() {

window.addEventListener('showPageB', showPageB);  

});

//event的作用是:如果a页面有传递参数,在下面的函数里可以使用event获取参数
// 如 var stuName = event.detail.stuName;
function showPageB(event){

//获取参数 event.detail.XXXXX;

//这里是直接打开页面,也可以使用动画
mui.currentWebview.show(); //然后B页面就直接出来了
}

fx4399

fx4399 - Android工程师、前端工程师

beforeback: function() {  
var list = plus.webview.currentWebview().opener();
list.addEventListener('loaded', function() {
alert("back");
mui.fire(list, 'refresh', {});
return true;
})
}

这句话怎么不执行 我是因为在iOS原因才加的loaded事件

  • DCloud_UNI_CHB

    list页面在加载完成时已经触发了loaded事件,你在新页面的返回时,是不会再次触发loaded事件的。

    2018-07-20 16:20

  • fx4399

    你好 plus.webview.getWebviewById('invoice-application-list.html').reload(); 这行代码 为什么在iOS中不支持 iOS中如何刷新当前页面

    2018-07-20 16:52

  • fx4399

    @57 详情页面代码:beforeback: function() {  

    var list = plus.webview.currentWebview().opener();

    mui.fire(list, 'refresh', {});

    return true;

    }

    列表页面代码:window.addEventListener('refresh', function(e) {

    plus.webview.getWebviewById('invoice-application-list.html').reload();

    });

    android 没问题 iOS不能刷新 请问是什么问题

    2018-07-20 16:55

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