0

私のシナリオ: jQuery Inputmask Plugin を使用していくつかの入力フィールドをマスクしようとしています。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

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 が存在する場合、ネイティブ実装が実行されることがわかります。IE8 にはない Array.prototype.indexOf のネイティブ実装があるため、IE11、Chrome、Firefox の場合は問題ありません。

したがって、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 も使用します。

ただし、配列の代わりに文字列パラメーターを使用して (jquery.inputmask が行うように) inArray を呼び出すと、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 に答える
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 に答える