0

我正在使用以下代码,

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]不调用函数。Not If use andriod.myFuncthen it works但我不希望函数被硬编码。

4

2 回答 2

3

您将this作为第一个参数传递给 apply ,但由于的值this取决于您调用 function 的方式,它只会反映全局对象,而它应该反映andriod(原文如此)对象。

只需this在以下行中替换andriod应该可以工作:

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

进入

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

改正andriodandroid以下函数:

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');
于 2013-01-10T15:33:18.367 回答
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);
    }
}
于 2013-01-09T09:28:22.630 回答