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

これは素晴らしいですが、AndroidのWebビューに適用されますが機能していません。alert(andriod[functionName])ください 'function myFunc(..){[native Code]}'。ただしandriod[functionName]、関数は呼び出されません。使用しない場合andriod.myFuncは機能しますが、関数をハードコーディングしたくありません。

4

2 に答える 2

3

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');
于 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 に答える