安卓InAppBrowser _system回调函数

5

我正在使用Cordova开发一款Android/iOS/Windows 8移动应用,需要将一些字符串传递给网页。不幸的是,该网页不支持TLS 1.0协议,这意味着旧版Android(和iOS版本)无法在本机浏览器中打开该页面。

这意味着当window.open调用设置为'_blank'时,任何Android 16 API版本之前的版本都无法加载该页面,并且仅在19 API及以上版本上才真正保证可行:

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

我的解决方案是将"_blank"更改为"_system"。这样可以使用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 你会吗?怎么做呢?外部浏览器的监听器没有触发。 - NineToYourSpine
抱歉,它是“您无法向外部浏览器添加侦听器”。 - jcesarmobile
@jcesarmobile 那么有没有办法在手机上的外部浏览器上运行脚本呢? - NineToYourSpine
不,这是不可能的。 - jcesarmobile
1
@jcesarmobile 好的,这就是我想听到的。我很惊讶这么难找到答案。文档上没有提到外部浏览器无法触发回调或在其上执行脚本。 - NineToYourSpine
2个回答

1
我听说当使用'_system'选项打开InAppBrowser窗口时,实际上无法在外部系统浏览器中执行脚本或触发回调。从我的测试来看,这似乎是真的。另一方面,'_blank'当然会触发回调,因为它使用应用程序内的原生浏览器。

这确实是我的经验 - _system似乎更像是“点火并忘记”。至少在与您同时打开的其他_blank或_self窗口发生冲突之前是这样。我真的很想知道为什么他们将_system捆绑在一起 - 它的行为如此不同。 - Keith Paul Barrow

0

为了在另一个文件上运行脚本,您需要首先像这样加载该文件:

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

OR +-------

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设备可以使用不同的浏览器登录网站。 - NineToYourSpine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接