【问题标题】:Javascript apply function is not working on Android WebView?Javascript应用功能不适用于Android WebView?
【发布时间】:2013-01-09 08:56:47
【问题描述】:

我正在使用以下代码,

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 那么它可以工作,但我不希望函数被硬编码。

【问题讨论】:

  • 不完全确定,但这可能是一个错字。你拼了好几次android andriod。
  • apply 方法是否可能被覆盖? alert(andriod[functionName].apply) 说什么?
  • @njzk2,我可以使用 andriod.myFunc 调用这个函数。但不适用于 andriod['myFunc'].apply
  • @user960567:这不是什么?!?我重复我的问题:alert(andriod[functionName].apply) 说什么?
  • @Martijn, alert(andriod[functionName]) 说,'function myFunc(..){[native Code]}'

标签: javascript android android-webview


【解决方案1】:

您将this 作为第一个参数传递给apply,但由于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);

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

【讨论】:

    【解决方案2】:

    我发现这是一种变通方法,不好但有效,

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 2023-03-27
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多