0

我的场景:我正在尝试使用 jQuery Inputmask 插件屏蔽一些输入字段。在 Chrome、Opera、Safari、IE10、Firefox 上可以,但在 IE8 上不行!

我创建了一个虚拟页面来测试其他脚本是否在干扰,但事实并非如此。

HTML

<!doctype html>
<html>
<head>
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript" src="inputmask/inputmask.js"></script>
    <script type="text/javascript" src="inputmask/jquery.inputmask.js"></script>
    <script type="text/javascript" src="inputmask/inputmask.extensions.js"></script>
    <script type="text/javascript" src="inputmask/inputmask.dependencyLib.jquery.js"></script>
    <script type="text/javascript" src="inputmask/inputmask.numeric.extensions.js"></script>
    <script type="text/javascript" src="inputmask/inputmask.phone.extensions.js"></script>
    <script type="text/javascript" src="inputmask/inputmask.regex.extensions.js"></script>
    <!--[if lte IE 8]>
    <script type="text/javascript" src="js/ie8customscripts.js"></script>
    <link href="css/ie8customstyles.css" rel="stylesheet" type="text/css">
    <![endif]-->
    <!--[if IE 9]>
    <script type="text/javascript" src="js/ie9customscripts.js"></script>
    <link href="css/ie9customstyles.css" rel="stylesheet" type="text/css">
    <![endif]-->
</head>
<body>
    cpf<br/><input id="cpf" type="text"></input>
    cnpj<br/><input id="cnpj" type="text"></input>
</body>
</html>

JS (ie8customscripts.js)

$(function(){  
   $("#cpf").inputmask("99-9999999");  //static mask
   $("#cnpj").inputmask({"mask": "(999) 999-9999"}); //specifying options
});

在我的实际页面中,我使用data-属性来设置掩码,这显然不适用于 IE8,所以我尝试这样做。

这是引发错误的确切行(它被抛出大约 20 次)。

输入掩码错误

在我知道之前,它应该可以在 IE8 上运行,对吧?

4

2 回答 2

1

IE8 及以下不支持indexOf. 您可以自己填充它,但是您正在修改本机对象的原型,这非常令人讨厌。但是,嘿,这就是 IE 游戏的名称。

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(elt /*, from*/)  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

信用:@NickCraver 为什么 indexOf 不能在数组 IE8 上工作?

于 2016-01-06T19:13:07.690 回答
1

我不知道你使用的是哪个版本的 jQuery 和 jquery.inputmask,但我昨天在 IE8 上运行 jQuery 1.8.3 和 jquery.inputmask 3.3.x 版本时遇到了同样的问题。所以我对 jquery.inputmask 做了一些调查,我意识到它依赖于 jQuery.inArray 方法,同时提供字符串和数组参数。我也检查了 jQuery 1.8.3、1.10.2、1.11.3、1.12.4 版本,情况完全一样。

这是它的 inArray 方法的 jQuery 实现:

inArray: function( elem, arr, i ) {
    var len;

    if ( arr ) {
        if ( Array.prototype.indexOf ) {
            return Array.prototype.indexOf.call( arr, elem, i );
        }

        len = arr.length;
        i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;

        for ( ; i < len; i++ ) {
            // Skip accessing in sparse arrays
            if ( i in arr && arr[ i ] === elem ) {
                return i;
            }
        }
    }

    return -1;
},

哟可以看到 Array.prototype.indexOf 是否存在,将执行本机实现。所以在 IE11、Chrome、Firefox 时没有问题,因为它们有 Array.prototype.indexOf 的本机实现,而 IE8 缺少这些实现。

所以在IE8中这部分代码会被执行:

        len = arr.length;
        i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;

        for ( ; i < len; i++ ) {
            // Skip accessing in sparse arrays
            if ( i in arr && arr[ i ] === elem ) {
                return i;
            }
        }

这段代码和 Antiga 建议的一样 - 所以在你的代码中你也可以使用 $.inArray

但是使用字符串参数调用 inArray(如 jquery.inputmask 所做的那样)而不是数组会导致arr行中的 i 异常,该异常在操作中对字符串无效。这就是为什么我在我的应用程序中使用了以下覆盖(当然包括 jquery.js 之后)(在我的公司仍然使用 IE8):

$.inArray = function (elem, arr, i) {
    var len;
    if (arr) {
        if (typeof arr === "string") {
            // this is my extension
            return arr.indexOf(elem, i);
        } else {
            if (Array.prototype.indexOf) {
                return Array.prototype.indexOf.call(arr, elem, i);
            }
            len = arr.length;
            i = i ? (i < 0 ? Math.max(0, len + i) : i) : 0;
            for (; i < len; i++) {
                // Skip accessing in sparse arrays
                if (i in arr && arr[ i ] === elem) {
                    return i;
                }
            }
        }
    }
    return -1;
};

这解决了与 jQuery 1.8+、jquery.inputmask 3.3.x 和 IE8 合作相关的所有问题。

于 2016-07-25T04:56:52.917 回答