我可以打开窗户,在里面做很多事情,例如通过Linkedin或Facebook登录。但我无法关闭它以返回我的应用程序。
1 /我试图抓住事件来跟踪网址,并在网址包含特定关键字时关闭窗口。但事件永远不会被解雇。我从来没有任何警觉。
var ref = window.open(url, '_blank', 'location=no');
ref.addEventListener('loadstart', function(event)
{
alert(event.url);
});
ref.addEventListener('loadstop', function(event)
{
alert(event.url);
});
2 /所以我试图找到一种方法,每隔n秒从第一个窗口检查ref.location.url。但是ref.location.url不存在。我没有看到从父窗口访问inapp当前URL的方法。
3 /我有一个想法给inapp窗口命名。但是inappbrowser插件不允许给窗口打开一个名称。因此父窗口也不能以这种方式检查子窗口的URL。 4 /我试图让孩子关注窗口关闭:cordova不想让javascript关闭当前窗口。 self.close(); => cannot
window.close(); => cannot
5 /我试图恢复到cordova.js 2.9.0-0-g83dc4bd,它也没有用。
所以,我可以在我的应用程序中打开一个弹出窗口并使用第三方Oauth然后我被困在这个弹出窗口中,我无法返回到我的应用程序。
我检查了几乎所有我在互联网上找到的东西,我现在绝对不知道该怎么做。
我使用cordova.js 3.5 Android版本,我用
安装inappbrowsercordova plugin add org.apache.cordova.inappbrowser
一切都是标准的,cordova.js已正确加载,我可以在日志中看到InappBrowser在我调用时正确使用。
08-08 16:20:20.594: D/InAppBrowser(8496): target = _blank
错误......帮忙?
:)
答案 0 :(得分:3)
我可以找到解决这个问题的方法。这很奇怪而且有偏见。但是,当我看到我不是唯一一个时,我在这里写下我的解决方案以及解决这个错误的方法。
首先,我添加了另一个听众:
ref.addEventListener('exit', function(event)
{
if (debug) alert('exit');
});
然后,我使用了注入脚本功能,我每5秒调用一次;
function getStateSecondWindow()
{
ref.executeScript(
{code: "localStorage.getItem('loginOauth')"},
function(data)
{
alert(data);
}
);
}
setInterval(getStateSecondWindow, 5000);
在那个阶段,我可以在日志中看到一些奇怪的东西:第一次调用getStateSecondWindow被阻止了。但是/ / / /开始起作用了。我突然让所有的事件监听器都正常工作。就好像我在某个地方有一个果酱,而executeScript()只是解锁了所有东西。
此解决方案适用于我的4个项目。每个人的行为都是一样的。
如果事件再次出现问题,我使用双系统检查我的第二页并找到一种方法在适当的时候关闭它:在第二页中,我使用本地存储来设置我的var的值: localStorage.setItem(“loginOauth”,“OK”);
在我的第一页中,我使用执行脚本来读取本地存储:
function getStateSecondWindow() {
ref.executeScript(
{code: "localStorage.getItem('loginOauth')"},
function(data)
{
if (data=='OK')
{
//do what I need to do
ref.close();
}
}
);
使用这个系统,我不依赖于(有时不是)射击事件。即使inappBrowser窗口中的页面来自另一个服务器,它仍然有效:由于javascript在第二个窗口中被解释,我们在原始localStorage所在的域中(没有交叉浏览问题)。
所以这就是我认为inAppBroswer不会触发事件并找到在需要时关闭第二个窗口的方法。希望它有所帮助:)