我们有 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 类中切换调试。日志在底部。
问题是这个issue不一致。有时很难重现。你必须尝试点击然后它就会发生。我假设核心是
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”...
最佳答案
我会将其添加为答案,以便将此问题列为已回答和已解决。
我们实际上将问题回溯到 Sencha Touch 事件处理程序——它们非常具体,因为它们需要处理实际 dom 元素的创建和删除(div 是定期创建和删除的)。这些事件附加到更高级别的“元素”,如 Ext.Container。这是 Ext 对 div 的表示,它是在使用时创建的,以后也可以删除,只是在重新创建一段时间后显示(作为不同的 DOM 元素)。这将使您无法绑定(bind)任何 DOM 事件。所以 Sencha 在内部处理这个。内部句柄以某种方式忽略了 event.preventDefault()
,这使得链接在 webview 和 childbrowser 中加载(所以,是的,你非常正确,Uncharted Space)。最简单的解决方案仍然是使用“non-href hrefs”(data-href)。但如果这不是您的选择,则可以使用内部 Sencha 事件系统来解决。
关于ios - Cordova InAppBrowser 打开但页面加载到主页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20049936/