如何在Phonegap应用程序中关闭InAppBrowser本身?

12

我正在开发Phonegap应用程序,目前我正在使用InAppBrowser来显示外部页面。在某些外部页面上,我放置了一个关闭按钮,我想关闭InAppBrowser本身。因为InAppBrowser显示这些页面,所以无法访问它自己的引用以关闭它,请不要建议我使用ChildBrowser插件。

window.close(); //Not Worked for me
or  
iabRef.close();  //Also not Worked for me because iabRef is not accessible on InAppBrowser. It is created on Parent Window

一些Android设备和iOS设备会显示一个Done按钮来关闭它。iPad也会显示Done按钮。但是在Android平板电脑的情况下,没有任何关闭它的按钮。

更新

这是我的完整代码:

var iabRef = null; 
function iabLoadStart(event) {
}
function iabLoadStop(event) {
}
function iabClose(event) { 
    iabRef.removeEventListener('loadstart', iabLoadStart);      
    iabRef.removeEventListener('loadstop', iabLoadStop); 
    iabRef.removeEventListener('exit', iabClose); 
}
function startInAppB() {
    var myURL=encodeURI('http://www.domain.com/some_path/mypage.html');
    iabRef = window.open(myURL,'_blank', 'location=yes');    
    iabRef.addEventListener('loadstart', iabLoadStart);
    iabRef.addEventListener('loadstop', iabLoadStop);
    iabRef.addEventListener('exit', iabClose);
}

请展示您打开 iInAppBrowser 的其余代码。 - Vicky Gonsalves
为什么不使用导航栏的返回按钮关闭它呢? - Ahmed I. Khalil
当InAppBrowser显示页面时,有一些链接,因此用户可以重定向到其他链接,这就是为什么返回按钮不适合我关闭的原因。 - Shashi
3个回答

11

这对我有用:

var win=window.open( "myurl", "_blank");
win.addEventListener( "loadstop", function(){
       var loop = window.setInterval(function(){
           win.executeScript({
                   code: "window.shouldClose"
               },
               function(values){
                   if(values[0]){
                     win.close();
                     window.clearInterval(loop);
                   }
               }
           );
       },100);
   });

在你所调用的窗口中,只需执行以下操作:

window.shouldClose=true

当您想关闭它时


非常感谢@Torsten Simon。您认为我们可以将参数值[1]、值[2]等从网站传递到应用程序中吗?谢谢。 - EHU
1
我只需使用JSON.stringify(object_in_site);来完成它,然后在应用程序中执行var object=JSON.parse(values[0]);。当然,这仅适用于可序列化的数据(如字符串和数字)。 - Torsten Simon
我明白了,但是我该如何执行它呢?在 window.shouldClose=true 之后还是之前?另外,localStore 对我没有起作用,所以 JSON 是唯一的希望。 - EHU
@PieroAlberto 是的,你说得对,但这个方法经常被覆盖,参见 https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-inappbrowser/。 - Torsten Simon
参见:https://stackoverflow.com/questions/59009164/timed-popup-with-phonegap-cordova-inappbrowser - Free Bud

6
这篇博客提供了一个解决方案:使用Cordova的InAppBrowser进行跨窗口通信
基本上,你可以从父窗口向InAppBrowser实例中反复使用executeScript()(例如每秒一次或两次),以检查IAB中是否设置了变量。按下IAB中的“关闭”按钮可以设置这样的变量。
当父窗口发现在IAB中设置了该变量时,父窗口使用IAB引用来close()它。

5
这里有一篇stackoverflow的帖子,介绍了如何实现该功能。
基本上,您需要通过调用window.open获取对内部浏览器的引用,并通过loadstop事件进行挂钩。在loadstop事件中检查url是否包含预定义路径(例如mobile/close-但可以是任何内容),然后调用close函数。
这是帖子的链接。

https://dev59.com/xmUp5IYBdhLWcg3wj4Lu#15981972


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