我们有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 并在主 Web 视图中加载。我设法在 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
我们使用的是科尔多瓦 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 元素)。这将导致您无法绑定任何 DOM 事件。所以Sencha在内部处理这个问题。内部句柄以某种方式忽略了event.preventDefault()
,这使得链接在webview和childbrowser中加载(所以,是的,你非常正确,神秘空间)。最简单的解决方案仍然是使用"non-href hrefs"(data-href)。但是,如果这不是您的选择,则可以使用内部Sencha事件系统来解决。