簡體   English   中英

Javascript Apply功能在Android WebView上不起作用?

[英]Javascript apply function is not working on 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如果使用andriod.myFunc可以正常工作,但我不希望該函數進行硬編碼。

您將this作為要應用的第一個參數傳遞,但是由於this的值取決於調用函數的方式 ,因此它將僅反映全局對象,而應反映andriod (原文如此)對象。

只需更換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');

我發現這是可以解決的,不好但是可以,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM