Выполнять функции машинописи, вызываемые из executeScript из InAppBrowser - PullRequest
0 голосов
/ 19 декабря 2018

Я реализую функциональность InAppBrowser ionic cordova, в которой мне нужно вызывать функцию, написанную вне события InSppBrowser «loadtop».Здесь я хочу вызвать функцию callBack () вскоре после выполнения события loadtop.Мой фиктивный код здесь ниже:

this.browser.on("loadstop").subscribe((event)=>{
this.browser.executeScript({code: if(document.getElementByID("ID").length > 1){function callBack();}})
});

callback(){
this.browser.hide();
}

Спасибо заранее!

1 Ответ

0 голосов
/ 20 декабря 2018

code, который вы вводите с помощью executeScript(), выполняется в области веб-просмотра InappBrowser, а не в веб-представлении приложения Cordova, поэтому не имеет видимости функций в вашем приложении Cordova.Также обратите внимание, что аргумент code, передаваемый executeScript(), должен быть строковым Javascript, поскольку он будет передаваться в веб-представление InappBrowser через собственный мост.

Поэтому существует два способа выполнения обратного вызова:

Во-первых, поскольку условие, вызывать ли ваш обратный вызов, может оцениваться синхронно в контексте веб-просмотра InappBrowser, вы можете синхронно возвращать результат запроса DOM, используя текущие выпуски npm cordova-plugin-inappbrowser, например:

callBack(){
    console.log("Typescript callback has been called");
    this.browser.hide();
}

this.browser.on("loadstop").subscribe((event)=>{
    this.browser.executeScript(
        {
            code: 'document.getElementByID("ID").length > 1;'
        },
        function(values){
            var result = values[0];
            if(result){
                callBack();
            }
        }
    );
});

Однако если результат вашего условия необходимо будет вернуть асинхронно, описанный выше метод не будет работать.Вместо этого вы можете использовать реализацию API postMessage, добавленную к cordova-plugin-inappbrowser для платформ Android и iOS с помощью этого PR .Он еще не выпущен в версии для npm, поэтому вам нужно установить основную ветку плагина непосредственно из репозитория Github:

cordova plugin add https://github.com/apache/cordova-plugin-inappbrowser

Затем вы будете использовать его так:

callBack(){
    console.log("Typescript callback has been called");
    this.browser.hide();
}

this.browser.on("message").subscribe((event)=>{
    if(event.data.action === "callBack"){
        callBack();
    }
});

this.browser.on("loadstop").subscribe((event)=>{
    this.browser.executeScript(
        {
            code: '\
                setTimeout(function(){\
                    if(document.getElementByID("ID").length > 1){\
                        webkit.messageHandlers.cordova_iab.postMessage(JSON.stringify({\
                            action: "callBack"\
                        }));\
                    } \
                }, 250);\
            '
        }
    );
});
...