Pea*_*kJi 2 javascript uiwebview webview ios cordova
根据这个问题,当我们设置window.location时,javascript将"停止"执行或变成竞争条件.
有时我们需要window.location = SOMESCH://xxx在WebView内多次触发,将"Notifications"发送回我们的应用程序.例如,设置window.location = myapp://loginButtonEnabled?e=1告诉应用程序用户填写了一些nessasary信息并可以开始登录.似乎不可能做这样的事情:
function(){
window.location = myapp://loginButtonEnable?e=1;
window.location = myapp://hideHintView;
.....
window.location = myapp://theLastThing;
}
Run Code Online (Sandbox Code Playgroud)
只有最后一个window.location = myapp://theLastThing将被触发,然后Javascript的执行将停止(虽然我们通过返回NO停止在我们的应用程序中重定向webView:shouldStartLoadWithRequest:navigationType:).
我发现有趣的是PhoneGap通过使用调度队列使这成为可能,但我仍然没有弄清楚它为什么有效,任何人都知道这个诀窍?
顺便说一句,有没有一种简单的方法可以在设置位置后"恢复"执行?它比使用操作队列要好得多.
您需要为事件循环提供每次响应位置更改的机会.这样做的典型方法是使用setTimeout具有小/零延迟的a,这具有将执行移动到下一个事件循环滴答的效果.尝试这样的事情:
var q=[];
function dequeue() {
window.location='myapp://'+q.shift();
if (q.length>0) setTimeout(dequeue,0);
}
function notifyApp(cmd) {
q.push(cmd);
if (q.length==1) setTimeout(dequeue,0);
}
notifyApp('loginButtonEnable?e=1');
notifyApp('hideHintView');
notifyApp('theLastThing');
Run Code Online (Sandbox Code Playgroud)
至于javascript执行停止,设置window.location不应该有此效果,除非它实际导致页面更改 - 也许尝试使用上面的技术,看看你的javascript是否在最后一次notifyApp()调用后继续.
编辑:此问题的另一种方法是创建临时iframe而不是更改当前页面的位置 - 请参阅例如 使用多个window.location.href调用触发shouldStartLoadWithRequest
| 归档时间: |
|
| 查看次数: |
1018 次 |
| 最近记录: |