我们有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'});
这有效-记录了“点击”。子浏览器打开。问题是有时候事件“掉线”,错过了浏览器并加载到主Web视图中。我设法在inappbrowser类中切换了debug。日志在底部。
问题是此问题不一致。有时很难复制。您必须尝试单击,然后它会发生。我认为核心是
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时创建的div表示,也可以稍后将其删除,以便在重新创建一段时间后显示(作为另一个DOM元素)。这将使您无法绑定任何DOM事件。因此,Sencha在内部进行处理。内部句柄以某种方式忽略event.preventDefault()
,这会使链接同时加载到webview和子浏览器中(因此,是的,您非常正确,Uncharted Space)。最简单的解决方案仍然是使用“ non-href hrefs”(数据-href)。但是,如果您不选择使用内部Sencha事件系统,则可以解决该问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句