我正在使用以下代码,

var iphoneUrl = 'myScheme://{0}?{1}'
function callNativeFunction(functionName) {
    var args = Array.prototype.slice.call(arguments, 1);
    if (window.andriod) {
        andriod[functionName].apply(this, args);
    }
    else {
        var params = '';
        for (var i = 0, len = args.length; i < len; i++) {
            params += 'param' + (i + 1) + '=' + encodeURIComponent(args[i]) + '&';
        }
        params = params.slice(0, -1);// remove last &
        window.location = iphoneUrl.format(functionName, params);
    }
}
callNativeFunction('functionName', 'param1');


这是String.Format,

String.prototype.format = function () {
    var args = arguments;
    return this.replace(/{(\d+)}/g, function (match, number) {
        return typeof args[number] != 'undefined'
          ? args[number]
          : match
        ;
    });
};


哪个很好但是在andriod webview上适用不起作用。 alert(andriod[functionName])给我'function myFunc(..){[native Code]}'。但是andriod[functionName]不会调用该函数。否如果使用andriod.myFunc,那么它可以工作,但是我不希望函数被硬编码。

最佳答案

您正在传递this作为要应用的第一个参数,但是由于the value of this is dependent on the way you call the function,它只会反映全局对象,而应该反映andriod(sic)对象。

只需将以下行中的this替换为andriod应该可以:

andriod[functionName].apply(this, args);


进入

andriod[functionName].apply(andriod, args);


andriod校正为android具有以下功能:

var iphoneUrl = 'myScheme://{0}?{1}'
function callNativeFunction(functionName) {
    var args = Array.prototype.slice.call(arguments, 1);
    if ('android' in window) {
        window.android[functionName].apply(window.android, args);
    }
    else {
        var params = '';
        for (var i = 0, len = args.length; i < len; i++) {
            params += 'param' + (i + 1) + '=' + encodeURIComponent(args[i]) + '&';
        }
        params = params.slice(0, -1);// remove last &
        window.location = iphoneUrl.format(functionName, params);
    }
}
callNativeFunction('functionName', 'param1');

关于javascript - Javascript Apply功能在Android WebView上不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14231463/

10-09 06:40