我使用以下代码,
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
那么它可以工作,但我不希望该功能被硬编码。
答案 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);
}
}