2013-01-09 58 views
0

我使用下面的代碼,JavaScript應用函數不適用於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 
     ; 
    }); 
}; 

這偉大的,但在安卓應用的WebView不工作。 alert(andriod[functionName])給我'function myFunc(..){[native Code]}'。但是andriod[functionName]不會調用該函數。不是如果使用andriod.myFunc那麼它可以工作,但我不希望該功能被硬編碼。

+2

不能完全肯定,但這可能是一個錯字。你拼寫android andriod幾次。 – njzk2

+0

'apply'方法可能被覆蓋? 'alert(andriod [functionName] .apply)'說了些什麼? – Martijn

+0

@ njzk2,我可以使用andriod.myFunc調用這個函數。但不是用andriod ['myFunc']。apply – user960567

回答

3

你傳遞this一起作爲第一個參數來申請,但由於the value of this is dependent on the way you call the 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'); 
+0

是的你是正確的。謝謝 – user960567

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); 
    } 
} 
相關問題