RobinHerbots 的 jQuery Inputmask 无法在 IE8 (WinXP) 上运行
RobinHerbots' jQuery Inputmask not working on IE8 (WinXP)
我的情况:我正在尝试使用 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 上运行,对吗?
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
Why doesn't indexOf work on an array IE8?
我不知道你用的是哪个版本的 jQuery 和 jquery.inputmask 但我昨天用 jQuery 1.8.3 和 jquery.inputmask 3 遇到了同样的问题。 3.x 版本 运行 在 IE8 上。所以我对 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 时没有问题,因为它们具有 IE8 中缺少的 Array.prototype.indexOf 的本机实现。
所以在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 那样)而不是数组会导致 i in arr 行出现异常,in operation is invalid for string。 这就是为什么我在我的应用程序中使用了以下覆盖(当然是在包括 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;
};
解决了jQuery1.8+,jquery.inputmask3.3.x与IE8配合的所有问题
我的情况:我正在尝试使用 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 上运行,对吗?
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 Why doesn't indexOf work on an array IE8?
我不知道你用的是哪个版本的 jQuery 和 jquery.inputmask 但我昨天用 jQuery 1.8.3 和 jquery.inputmask 3 遇到了同样的问题。 3.x 版本 运行 在 IE8 上。所以我对 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 时没有问题,因为它们具有 IE8 中缺少的 Array.prototype.indexOf 的本机实现。
所以在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 那样)而不是数组会导致 i in arr 行出现异常,in operation is invalid for string。 这就是为什么我在我的应用程序中使用了以下覆盖(当然是在包括 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;
};
解决了jQuery1.8+,jquery.inputmask3.3.x与IE8配合的所有问题