Javascript apply函数在Android WebView上不起作用?

时间:2013-01-09 08:56:47

标签: javascript android android-webview

我使用以下代码,

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那么它可以工作,但我不希望该功能被硬编码。

2 个答案:

答案 0 :(得分:3)

你将this作为第一个参数传递给apply,但是从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');

答案 1 :(得分:0)

我发现这是一种解决方法,不好但有效,

function apply(obj, methodName, args) {
    switch (args.length) {
        case 0: return obj[methodName]();
        case 1: return obj[methodName](args[0]);
        case 2: return obj[methodName](args[0], args[1]);
        case 3: return obj[methodName](args[0], args[1], args[2]);
        case 4: return obj[methodName](args[0], args[1], args[2], args[3]);
        case 5: return obj[methodName](args[0], args[1], args[2], args[3], args[4]);
        case 6: return obj[methodName](args[0], args[1], args[2], args[3], args[4], args[5]);
        case 7: return obj[methodName](args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
    }
}


function callNativeFunction(functionName) {
    var args = Array.prototype.slice.call(arguments, 1);
    if (window.android) {
        apply(android, functionName, 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);
    }
}