Cordova InAppBrowser会打开,但页面会加载到主页面中

时间:2013-11-18 14:16:38

标签: ios cordova cordova-3 inappbrowser

我们有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”......

1 个答案:

答案 0 :(得分:3)

我将此作为答案添加,以便将此问题列为已解决的答案。

我们实际上将问题回溯到Sencha Touch事件处理程序 - 它们非常具体,因为它们需要处理创建和删除实际的dom元素(div会定期创建和删除)。这些活动附属于更高层次的元素"像Ext.Container。这是Ext的div表示,在使用它时创建的任何一个也可以稍后删除,只是为了在重新创建一段时间后显示(作为不同的DOM元素)。这将使您无法绑定任何DOM事件。所以Sencha在内部处理这个问题。内部句柄以某种方式忽略event.preventDefault(),这使得webview和childbrowser中的链接加载(所以,是的,你非常正确,Uncharted Space)。最简单的解决方案仍然是使用"非href hrefs" (数据HREF)。但如果这不适合您,可以使用内部Sencha事件系统解决。

相关问题