2009-05-19 7 views
1

背景:私たちのWebアプリケーションは、jquery.constrain.jsプラグインを使っていくつかのテキストボックスのデータ入力を処理し、有効な文字を追加できるようにしています。このプラグインは、正規表現、ホワイトリスト/ブラックリスト文字などを使用して、データにさまざまな制約を与えます。今日までは、このプラグインの1.0リリースを変更せずに実行していました。JQuery "Constrain"プラグイン - 奇妙なJavascriptエラー

数日前にテキストボックスの一部に無効なデータ入力が許可されていたことに気付きました。たとえば、数値のみのテキストボックスではアルファベット文字を使用できます。また、「オブジェクトはこのプロパティまたはメソッドをサポートしていません」というjavascriptエラーも表示されました。私はそれをjquery.constrainプラグインの次の関数に追跡しました。このコードブロックを通る

function match(item, input, e) { 
     var arr = item.chars.split(""); 
     for (var i in arr) { 
      var token = arr[i]; 
      if (token.charCodeAt(0) == e.which) { 
       return true; 
      } 
     } 
     if (item.regex) { 
      var re = new RegExp(item.regex); 
      if (re.test(String.fromCharCode(e.which))) { 
       return true; 
      } 
     } 

     return false; 
    }; 

デバッグ、私は次のように決定:

  • 項目は、2つの文字列プロパティを有するオブジェクトである:文字正規表現
  • item.charsは、障害発生時の空の文字列( "")です。
  • arrの結果、のitem.chars.split( "")の結果は、空の配列になります。

ここは奇妙です。 arrは空の配列ですが、forループはiに有効な値を割り当てます。値は "remove"です。だから我々はループに入る。 arr ["remove"]がnullであるため、トークンは明らかにnullです。だからtoken.charCodeAt(0)がスローします。

次のように私は、forループの周りにif文を追加することで、エラーを訂正:

 if (arr.length > 0) { 
      for (var i in arr) { 
       var token = arr[i]; 
       if (token.charCodeAt(0) == e.which) { 
        return true; 
       } 
      } 
     } 

をしかし、私は完全にこれも必要た理由として困惑しています - これはIEのバグです、プラグインのバグ、または私はちょうど私がアプリケーションをコンパイルするときに私の息を間違って保持していますか?

答えて

1

配列をループするには、(i in arr)を使用しないでください。スクリプトがArrayプロトタイプにメソッドを追加する場合、これらもfor(i in arr)ループを使用して反復されます。これはおそらくあなたのエラーを引き起こしているものです。おそらく、Array.prototypeチェーンを変更するスクリプトを追加したでしょう。

また下にここで読む「なぜ、あなたが使用して停止する必要があります...で反復しない(または決してそれを取る)する」
http://www.prototypejs.org/api/array

+0

だったうん、。 JQueryはArray.prototypeを変更し、さらにいくつか追加しました。私はプラグインの作者に知らせて、私たちのローカルバージョンも修正します。 – GalacticCowboy