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);\
'
}
);
});