打开InAppBrowser的两个实例(_system和_blank)可防止触发事件

时间:2016-06-06 08:34:39

标签: javascript cordova inappbrowser

我们目前正在使用cordova和InAppBrowser插件开发应用程序。我们正在尝试同时生成两个不同的IAB实例。一个使用_system浏览器,另一个使用_blank选项。

我们遇到的问题是,一旦我们打开_system浏览器的实例,我们就会失去对以前浏览器的引用。因此,在_system浏览器关闭后,关闭事件永远不会在_blank IAB上触发。

这就是实际代码的样子。

NavigationBar

如您所见,我们使用_blank选项打开应用程序中的第一个URL。然后,如果在子应用程序中按下了一个按钮,我们想在_system浏览器中打开一个浏览器实例。

我们尝试过(没有运气):

为_system浏览器提供单独的参考。

// Opening iab main window
var ref = window.open(global.chat_mediador, '_blank','location=no,toolbar=yes');

var handleEvents =  function(event) {

    // Closing the iab window 
    if (event.url.match('#close')) {
        ref.close();
    }

    // Trigger custom event
    if (event.url.match('#openccard')) {
        window.open('https://www.test.example.url.com?customerID=' + event.customerId, '_system', 'location=yes');
    }

}

// InAppBrowser events

// This events are duplicated because loadstop works on android and
// loadstart works on ios.
ref.addEventListener('loadstart', handleEvents, false);
ref.addEventListener('loadstop', handleEvents, false);

// Removing the dialog when we close the chat
ref.addEventListener('exit', function(event) {
    generali.dialog.close();
}, false);

在_blank浏览器的引用之外触发自定义事件

window.open(global.url_ficha + customerId, '_system','location=no');
var cardsRef = window.open(
    'https://www.test.example.url.com?customerID=' + customerId,
    '_system', 
    'location=yes'
);         

任何人都知道发生了什么?

1 个答案:

答案 0 :(得分:3)

每次进行新窗口时,您似乎都需要初始化IAB。如果您不这样做,那么事件监听器就无法工作。

如果我使用该代码,它就像一个魅力。

chain<T>(source: Observable<T>, destination: Subject<T>): Observable<T>
{
    let processed = false;
    return source.catch(
        err => {
            let ret = new ReplaySubject<T>(1);
            destination.first().subscribe(ret);
            processed = true;
            destination.error(err);
            return ret;
        }
    ).finally(
        () => {
            // TODO: Allow sources to not propagate complete status
            !processed && destination.complete();
            processed = true;
        }
    ).flatMap(
        (next: T) => {
            let ret = destination;
            if(!processed)
            {
                ret = new ReplaySubject<T>(1);
                destination.first().subscribe(ret);
                destination.next(next);
            }
            processed = false;
            return ret;
        }
    );
}