首页 > 解决方案 > 有什么方法可以传输数据说在 inappbrowser 中定义的变量并在 executeScript 方法中传递它的值?

问题描述

我想使用在cordova的inAppBrowser中定义的变量并在executeScript方法中使用它?

ref = cordova.InAppBrowser.open(env,'_blank','clearcache=no,location=no,
clearsessioncache=no, footer=no,zoom=no' );

var variable_needed = 1;

ref.addEventListener("loadstop", function(e) { ref.executeScript({
                    code: "console.log(variable_needed);"})
});

当我试图访问 varible_in executescript 时,它给出了 NULL。

我知道它们是不同的 javascript 包。有什么办法可以做到这一点?

标签: androidcordovaionic-frameworkcordova-plugins

解决方案


通过codekeyexecuteScript()传递的值作为字符串传递给 Java 层,Java 层将其注入到 Inappbrowser 的 Webview 中eval()。因此,Cordova 应用程序 Webview 和 InappBrowser Webview 之间没有直接的“连接”,允许直接共享 Javascript 实体。由于数据是作为字符串传递的,因此只能传递可字符串化的 Javascript 数据(即不能传递函数)。

在上述情况下,变量值应该简单地内联在代码字符串中:

ref = cordova.InAppBrowser.open(env,'_blank','clearcache=no,location=no, clearsessioncache=no, footer=no,zoom=no' );

var variable_needed = 1;

ref.addEventListener("loadstop", function(e) { 
    ref.executeScript({
        code: "console.log("+variable_needed+");"
    });
});

但是,如果要发送更复杂的对象结构,则需要对其进行字符串化,例如:

ref = cordova.InAppBrowser.open(env,'_blank','clearcache=no,location=no, clearsessioncache=no, footer=no,zoom=no' );

var myObj = {
    foo: "bar"
};
var s_myObj = JSON.stringify(myObj);

ref.addEventListener("loadstop", function(e) { 
    ref.executeScript({
        code: "var myObj = JSON.parse('"+s_myObj+"'); console.dir(myObj);"
    });
});

推荐阅读