【问题标题】:Cordova InAppBrowser opens but the page is loaded in the main oneCordova InAppBrowser 打开,但页面加载到主页面中
【发布时间】: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


【解决方案1】:

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

我们实际上将问题追溯到 Sencha Touch 事件处理程序——它们非常具体,因为它们需要处理实际 dom 元素的创建和删除(div 会定期创建和删除)。这些事件被附加到更高级别的“元素”,如 Ext.Container。那是 Ext 对 div 的表示,它是在使用时创建的,any 也可以稍后删除,以便在重新创建一段时间后显示(作为不同的 DOM 元素)。这将使您无法绑定任何 DOM 事件。所以 Sencha 在内部处理这个问题。内部句柄以某种方式忽略了event.preventDefault(),这使得链接在 webview 和 childbrowser 中都加载(所以,是的,你非常正确,Uncharted Space)。最简单的解决方案仍然是使用“非href hrefs”(data-href)。但是,如果这不是您的选择,则可以使用内部 Sencha 事件系统来解决。

【讨论】:

  • 帮了我很多。只需使用带有 onclick 的 div 而不是 hrefs 就可以了。
  • Arqu:我建议使用 span(因为它默认显示为内联 - 链接也是如此)。但是使用 JS 将 hrefs 转换为 data-hrefs 仍然是更好的 IMO,因为它允许您保持与在 Web 上显示的相同的 HTML 和 CSS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 2017-10-21
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多