【发布时间】:2013-11-18 14:16:38
【问题描述】:
我们有 Sencha Touch 应用程序。它显示各种内容,包括带有应用程序外部链接的页面(到不同的 Web 服务器)。我们所做的是添加了一个 inappbrowser 插件来处理链接。
this.getItemsDetail().element.on('tap', function(event, target) {
event.preventDefault();
window.open(target.href, '_blank');
console.log('tap');
}, this, {delegate : 'a'});
这行得通 - 记录了“点击”。子浏览器打开。问题是有时事件“失败”,错过了inappbrowser并加载到主webview中。我设法在 inappbrowser 类中切换调试。日志在底部。
问题是这个问题并不一致。有时很难复制。您必须尝试单击然后才会发生。我假设核心是
2013-11-18 14:11:18.362 CDVWebViewDelegate: Navigation started when state=1
2013-11-18 14:11:18.363 Failed to load webpage with error: CDVWebViewDelegate: Navigation started when state=1
我不知道该消息的确切含义。从代码看来,“状态 1”是“STATE_WAITING_FOR_LOAD_START”
typedef enum {
STATE_IDLE,
STATE_WAITING_FOR_LOAD_START,
STATE_WAITING_FOR_LOAD_FINISH,
STATE_IOS5_POLLING_FOR_LOAD_START,
STATE_IOS5_POLLING_FOR_LOAD_FINISH,
STATE_CANCELLED
} State;
但仍然 - 我不确定我做错了什么以及如何以“正确”状态加载网页。
16.285 tap
16.300 webView shouldLoad=1 (before) state=0 loadCount=-1 URL=http://spokendata.com/
16.300 webView shouldLoad=1 (after) isTopLevelNavigation=1 state=1 loadCount=0
16.301 webView didStartLoad (before). state=1 loadCount=0
16.301 webView didStartLoad (after). state=2 loadCount=1 fireCallback=1
16.465 webView didFinishLoad (before). state=2 loadCount=1
16.466 webView didFinishLoad (after). state=0 loadCount=0 fireCallback=1
18.362 webView shouldLoad=1 (before) state=1 loadCount=0 URL=http://spokendata.com/
18.362 CDVWebViewDelegate: Navigation started when state=1
18.363 Failed to load webpage with error: CDVWebViewDelegate: Navigation started when state=1
18.364 webView shouldLoad=1 (after) isTopLevelNavigation=1 state=1 loadCount=0
18.438 webView didStartLoad (before). state=1 loadCount=0
18.439 webView didStartLoad (after). state=2 loadCount=1 fireCallback=1
18.439 Resetting plugins due to page load.
18.553 webView didFinishLoad (before). state=2 loadCount=1
18.553 webView didFinishLoad (after). state=0 loadCount=0 fireCallback=1
18.553 Finished load of: http://spokendata.com/
18.995 webView shouldLoad=1 (before) state=0 loadCount=0 URL=http://spokendata.com/demo
18.996 webView shouldLoad=1 (after) isTopLevelNavigation=1 state=1 loadCount=0
18.997 webView didStartLoad (before). state=1 loadCount=0
18.997 webView didStartLoad (after). state=2 loadCount=1 fireCallback=1
18.997 Resetting plugins due to page load.
19.152 webView didFinishLoad (before). state=2 loadCount=1
19.152 webView didFinishLoad (after). state=0 loadCount=0 fireCallback=1
19.153 Finished load of: http://spokendata.com/demo
我们正在使用 Cordova 3.1.0-0.1.0
更新: 它偶尔会发生 - 有时有效,有时无效。它发生在各种页面(大小)上。我创建了一个应用程序 (https://github.com/tomasfejfar/cordova-bug-01),我可以在其中复制问题。您只需尝试单击“SEZNAM”链接足够长的时间以显示“seznam.cz”而不是“google.com”...
【问题讨论】:
-
我确定您已经尝试过,但只是想验证没有模式?就像,如果网站需要更长的时间来加载,它是否只会在 web 视图中打开不正确?或者可能在打开 webview X 次后它失败了。您可以尝试的另一件事....当您取出 jquery 时它会这样做吗?也许只是做一个没有jquery的所有链接的精简页面,看看它是否可以复制。
-
不要把url放在锚标签的href中。如果您确实需要将 url 存储在属性中,请使用 data-href 或类似的东西。
-
我实际上设法使用您的建议 Uncharted Space 修复它。但我不得不使用 javascript 删除该属性 - 因为内容是显示在 WebView 中的普通网页内容......但仍然不知道为什么会这样......
-
大多数时候事情只是偶尔发生(尤其是在 Web 编程中)是一种竞争条件。我猜该链接正在尝试在主视图和应用程序浏览器中加载,并且它需要先到达。你试着把 onclick="return false;"在您的锚标签中查看是否是问题所在。
标签: ios cordova cordova-3 inappbrowser