【问题标题】:Cordova inappbrowser looses event handlers when system browser opens系统浏览器打开时 Cordova inappbrowser 丢失事件处理程序
【发布时间】:2017-06-07 00:10:29
【问题描述】:

我这几天一直在努力解决这个问题,所以真的希望有人能提供解决方案!

这个问题只存在于Android,iOS似乎可以正常工作。

应用正在使用 inappbrowser 显示网站。单击网站外部的链接时,我想在系统浏览器中启动所选链接,然后确保 inappbrowser 页面不会更改。我使用下面的代码进行这项工作。我遇到的问题是,在系统浏览器打开后,我的所有事件(loadstart、loadstop)都不再起作用,因此如果选择了另一个外部链接,现在在 loadstart 事件中不会检测到它并在 inappbrowser 中打开。

如果我只是注释掉 window.open(url, '_system');在 loadstart 事件中,一切都继续正常工作,但显然外部链接没有在系统浏览器中打开。

launchBrowser: function (url) {
    app.inAppBrowserRef = cordova.InAppBrowser.open(url, '_blank', app.browserOptions);
    app.inAppBrowserRef.addEventListener('loadstart', function (event) {
        var url = event.url;
        // Determine if this is an external link that should be launched in the system browser.
        if (url.toLowerCase().indexOf(app.portalUrl.toLowerCase()) === -1) {
            //External link, launch in system browser.
            window.open(url, '_system');
            app.setInappBrowserUrl(app.previousUrl);
        }
    });
    app.inAppBrowserRef.addEventListener('loadstop', function (event) {
        app.previousUrl = event.url;
    });
},

覆盖inappbrowser页面的功能。

setInappBrowserUrl: function (overrideUrl) {
    app.inAppBrowserRef.executeScript({
        code: "window.location = '" + overrideUrl + "';"
    }, function () {
        //alert("Redirected!");
    });
}

我有一个粗略的解决方法,涉及使用我要显示的 url 调用 launchBrowser(),但问题是我丢失了所有历史记录,所以当你按下后退按钮时,inappbrowser 会关闭。

感谢收看!

【问题讨论】:

  • 您使用的是hardwareback 选项吗?必须设置为yes
  • 我正在使用hardwareback选项,这一切都按预期工作,即在解决它时关闭了inappbrowser,因为没有前一页可以访问,因为inappbrowser已被重新初始化。我只想把这个工作作为最后的手段。
  • 我在 iOS 上遇到了同样的问题 :( 你找到解决方案了吗?

标签: javascript android cordova inappbrowser


【解决方案1】:

InAppBrowser eventHandler 需要重新初始化一次 cordova.InAppBrowser.open(url, '_system');或 window.open(url, '_system');在事件处理程序中调用。在您的代码中,添加对 window.open(url, '_system'); 的引用并添加 eventHandler 如下:

    function loadStartEventHandler(event){
    var url = event.url;
    // Determine if this is an external link that should be launched in the system browser.
        if (url.toLowerCase().indexOf(app.portalUrl.toLowerCase()) === -1) {
          //External link, launch in system browser.
          //window.open(url, '_system');
          //reference the new InAppBrowser
          var ref = window.open(url, '_system');
          //reassign the event handler
          ref.addEventListener('loadstart', loadStartEventHandler);

          app.setInappBrowserUrl(app.previousUrl);
        }
    }
    app.inAppBrowserRef.addEventListener('loadstart', loadStartEventHandler);

该错误已提交给cordova apache。 https://issues.apache.org/jira/browse/CB-13198

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多