首先说明 webview的功能是正常的,问题在于plus is not defined居然没找到到底是哪个页面哪个函数报错。
这个是自己封装的openWindow
owner.openWindow = function(target, title, normalOpen, callback) {
if(owner.isapp) {
if(target) {
var turl = owner.getRootPath() + "/template.html";
var id = "" + target
var tmpl = plus.webview.create(turl, id)
tmpl.addEventListener('loaded', function() {
mui.fire(tmpl, 'update', {
title: title,
target: encodeURI(target)
});
tmpl.show('slide-in-right')
})
} else {
if(callback) {
callback();
}
}
} else {
normalOpen();
}
}
这一段是模板页面的js
window.addEventListener("update", function(e) {
window.onerror = function(e){
console.log(e)
alert(e)
}
var titleElem = document.getElementById("title"),
menuElem = document.getElementById("menu"),
self = plus.webview.currentWebview(),
substyles = {
top: '65px',
bottom: '0px'
};
var title = e.detail.title;
var showMenu = e.detail.showMenu;
var href = e.detail.target;
var aniShow = e.detail.aniShow;
var sub = plus.webview.create(href, title, substyles);
sub.addEventListener('loaded', function() {
self.append(sub);
})
sub.addEventListener('error', function(err) {
console.log(err);
})
mui.back = function() {
self.close('slide-out-right');
}
titleElem.innerHTML = title;
titleElem.className = "mui-title mui-fadein";
var display = showMenu ? "" : "none";
if(showMenu) {
mui.options.keyEventBind.menubutton = true;
} else {
mui.options.keyEventBind.menubutton = false;
}
menu.style.display = display;
//状态栏预留
$("header").css("padding-top", plus.navigator.getStatusbarHeight() + "px");
$("#back").show();
$("#title").show();
menuElem.addEventListener('tap', function(e) {
e.stopPropagation();
if(contentWebview == null) {
contentWebview = plus.webview.currentWebview().children()[0];
}
contentWebview.evalJS('mui("#topPopover").popover("toggle")');
});
mui.menu = function() {
console.log(menuElem.style.display);
if(menuElem.style.display !== "none") {
if(contentWebview == null) {
contentWebview = plus.webview.currentWebview().children()[0];
}
contentWebview.evalJS('mui("#topPopover").popover("toggle")');
}
}
});
这一段是模板页的subview页面
<html>
<head>
<meta charset="utf-8">
<title>设置</title>
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link href="../assets/mui/css/mui.min.css" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="../css/base.css" />
<link href="../assets/mui/css/app.css" rel="stylesheet" />
<link href="../css/settings.css" rel="stylesheet" />
</head>
<body>
<a href="mydetail.html" class="mui-table">
<div class="mui-table-cell mui-col-xs-10 icon-myfile">
账户与安全
</div>
<div class="mui-table-cell mui-col-xs-2">
<span class="mui-icon mui-icon-forward listiocn"></span>
</div>
</a>
<a href="mydetail.html" class="mui-table" style="margin-bottom: 10px;">
<div class="mui-table-cell mui-col-xs-10 icon-myfile">
提醒设置
</div>
<div class="mui-table-cell mui-col-xs-2">
<span class="mui-icon mui-icon-forward listiocn"></span>
</div>
</a>
<a href="mydetail.html" class="mui-table">
<div class="mui-table-cell mui-col-xs-10 icon-myfile">
联系我们
</div>
<div class="mui-table-cell mui-col-xs-2">
<span class="mui-icon mui-icon-forward listiocn"></span>
</div>
</a>
<a href="mydetail.html" class="mui-table" style="margin-bottom: 10px;">
<div class="mui-table-cell mui-col-xs-10 icon-myfile">
关于我们
</div>
<div class="mui-table-cell mui-col-xs-2">
<span class="mui-icon mui-icon-forward listiocn"></span>
</div>
</a>
<a href="mydetail.html" class="mui-table">
<div class="mui-table-cell mui-col-xs-10 icon-myfile">
检查更新
</div>
<div class="mui-table-cell mui-col-xs-2">
<span class="mui-icon mui-icon-forward listiocn"></span>
</div>
</a>
<button id="logout">退出登录</button>
</body>
<script src="../js/zepto.min.js" type="text/javascript" charset="utf-8"></script>
<script src="../assets/mui/js/mui.min.js"></script>
<script src="../js/app.js" type="text/javascript" charset="utf-8"></script>
</html>
报错为
Uncaught SyntaxError: Unexpected token ILLEGAL
Uncaught ReferenceError: plus is not defined (提示: 请在plus ready后再调用plus api) at assets/mui/js/mui.min.js:6
Uncaught ReferenceError: plus is not defined (提示: 请在plus ready后再调用plus api) at assets/mui/js/mui.min.js:6
Uncaught ReferenceError: plus is not defined (提示: 请在plus ready后再调用plus api)
第一个和最后一个没有具体位置
模板页面那个onerror没进
现在觉得 是openWindow里面webview.addEventListener('loaded',CB)这个loaded是监听的DOM Ready而不是plusReady 导致我模板页监听update事件的时候 里面的plus调用报错
但是现在功能都正常 模板webview 模板subview都能够正常显示。
想了解一下 这个loaded到底监听到DOM渲染、js执行、plusReady哪一些。
现在基本确定loaded是监听不到plusReady的(ios9.3.3是正常的,Android有问题 ) 因为之前监听update事件是写在plusReady里面的,导致随机进入update的callback里面。意思就是在plusReady中JSBirdge还没加载完成的时候 就已经向模板页面fire了update事件,还没解析到我的addEventListener('update')。
感觉踩了一个大坑,以上的分析都只是猜想。
目前功能都正常 模板webview 模板subview都能够正常显示。
但是报错定位无能为力。
MUI_Charles (作者)
定位到mui.js里面没什么用啊 我要定位哪个页面里面报错
2016-09-21 14:35
MUI_Charles (作者)
以及该页面的哪里的函数调用导致的报错
2016-09-21 14:36
lhyh
回复 MUI_Charles:定位哪个页面是吧,你在你的这个公用方法里多接受一个参数代表页面,其它地方调用方法的时候把当前页面的url或者title传进去,console.log一把不就知道了
2016-09-21 14:48
MUI_Charles (作者)
可以一试。Thanks anyway.
2016-09-21 15:11