【问题标题】:Android InAppBrowser _system callbacksAndroid InAppBrowser _system 回调
【发布时间】:2015-07-15 03:23:53
【问题描述】:

我一直在 Cordova 中为 Android/IOS/Windows 8 开发一个移动应用程序,该应用程序需要向网页传递一些字符串。对我来说不幸的是,该网页不支持 TLS 1.0 协议,这意味着较旧的 Android 版本(和 IOS 版本)无法在本机浏览器中打开该页面。

这意味着 window.open 调用,当设置为 '_blank' 时,不会在 16 API 之前的任何 Android 版本上加载页面,并且只有 19 API 及更高版本才真正保证:

window.open('https://www.libertymountain.com/login.aspx','_blank') 

我的解决方案是将其更改为“_system”而不是“_blank”。这是可行的,因为手机可以使用 chrome 或 safari 浏览器而不是原生浏览器。但是,当我这样做时,所有回调都停止工作。它只是打开页面,我无法在其上运行脚本。

例如,下面的代码永远不会执行回调。它只是打开网页:

var ref = window.open('https://www.libertymountain.com/login.aspx','_system');
ref.addEventListener('loadstart', function() { alert("Hello"); });

是我遗漏了什么,还是有合适的方法来做到这一点?

编辑:为了清楚起见,这是我永远不会触发回调的代码:

document.addEventListener("deviceready", init, false);

function init() {
    window.open = cordova.InAppBrowser.open;
    var ref = window.open('https://www.libertymountain.com/login.aspx', '_system');
    // This event never triggers, nor does any other event, even though the
    // webpage is opened in Chrome
    websiteReference.addEventListener('loadstart', function(event) { console.log('Hello'); });
}

如果我把它改成这个,事件就会触发。但我需要使用 '_system' 来完成,否则旧的 Android 和 IOS 设备将无法执行此操作。

document.addEventListener("deviceready", init, false);

function init() {
    window.open = cordova.InAppBrowser.open;
    // Change '_system' to '_blank'
    var ref = window.open('https://www.libertymountain.com/login.aspx', '_blank');
    // This event never triggers, nor does any other event, even though the
    // webpage is opened in Chrome
    websiteReference.addEventListener('loadstart', function(event) { console.log('Hello'); });
}

【问题讨论】:

  • @jcesarmobile 你可以吗?如何?侦听器不会为外部浏览器触发。
  • 抱歉,是“您无法将侦听器添加到外部浏览器”
  • @jcesarmobile 那么有没有办法在手机的外部浏览器上运行脚本呢?
  • 不,不可能
  • @jcesarmobile 好的,这就是我需要听到的。我很惊讶这很难找到。文档没有说明外部浏览器无法触发回调或在其上执行脚本。

标签: javascript android cordova callback inappbrowser


【解决方案1】:

我听说您实际上无法在外部系统浏览器中执行脚本或触发回调(当使用 InAppBrowser window.open() 的“_system”选项时)。从我的测试来看,这似乎是真的。另一方面,“_blank”当然会触发回调,因为它使用的是应用程序中的本机浏览器。

【讨论】:

  • 这当然是我的经验 - _system 似乎或多或少地火了就忘记了。至少在它与您可能同时打开的其他 _blank 或 _self 窗口发生冲突之前。我真的很想知道为什么他们将 _system 捆绑在一起 - 它的行为如此不同
【解决方案2】:

为了在另一个文件上运行脚本,您需要先加载该文件,如下所示:-

var ref = window.open('http://www.libertymountain.com/','_system');
$(ref .document).load(function() {
    alert('Hello');
    // do other things
});

或+-------

document.addEventListener("deviceready", onDeviceReady, false);

// device APIs are available
//
function onDeviceReady() {
     var ref = window.open('http://www.libertymountain.com/','_system');
     ref.addEventListener('loadstart', function(event) { alert('Hello'); });
}

【讨论】:

  • 我已经试过第二个了。只有将“_system”更改为“_blank”时才会触发回调。正如我在帖子中解释的那样,这是一个问题,因为我需要使用“_system”,以便旧的 Android/IOS 设备可以使用不同的浏览器登录网站。
猜你喜欢
  • 2019-02-01
  • 2019-05-16
  • 2017-03-24
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
相关资源
最近更新 更多