2011-06-22 3 views
3

これはIEのJSバグと考えられますか?つまり、変数名としてjavascriptと 'item'

次の関数

function select_deselect_all_items(status) 
    { 
     select_deselect_items_under_panel(status, $('myPanel')); 

     panel = $('myPanel'); 
     var items = panel.getElementsByTagName('input'); 
     for (var n = 0; n < items.length; n++) { 
      item = items[n]; 
      if (item.id.substr(0, 10) == 'myItems_') { 
       item.checked = status; 
       select_deselect_items_under_panel(status, $('myPanel')); 
      } 
     } 
    } 

を確認してください、これはFFとChromeで正常に動作しますが、IEでエラーが発生します。エラーは以下の通りです:

Error: Unable to get value of the property 'substr': object is null or undefined

私は私のコード全体にいくつかの場所でこの機能を持っている(残念ながら、1つのJSファイルにそれを置いていない)と私はすでにこの問題につまずいてきました。問題はitem変数であるようです。これが何かに変更された場合(myWildVarNameなど)、問題は正常に機能しているようです。 IEでページをデバッグしたところ、itemが特定のプロパティを持つオブジェクトであることがわかりました...

したがって、バグや新人ミスですか?

乾杯

+2

エラーとは何ですか? – Ibu

+0

ありがとうIbu。そこは今です。 – hummingBird

+0

私はこのミスを自分で追跡しました。私はthoush:JSfiddle http://jsfiddle.net/eyrv1a08/ – Moberg

答えて

7

は、あなたはその中であなたはitem変数を宣言したことがないので、Horror of Implicit Globalsに餌食になる、あなたのコードに誤りを持っています。

私の推測では、あなたがnameまたはid「アイテム」のいずれかを持っているあなたのページに何かを持っているということで、IEは(および他の多くのブラウザが追随している)ことを行いますので、そのためには、windowの財産になっています。ご存じのとおり、windowのプロパティはグローバルなので、関数内のitemシンボルに割り当てようとすると、そのグローバルプロパティに割り当てられます。 itemに応じて、IEは "実際にオブジェクトに割り当てるのではなく、その代わりにデフォルトのプロパティに代わる"ロジックを適用しようとしている可能性があります(ホストオブジェクトを使用したい場合、問題。

ローカル変数(は常にが良い考えです)を宣言し、問題は解決しなくてはなりません。


更新:今、あなたは、実際のエラーを掲載しましたことを、何が起こっているかについて上記の根拠は上、スポットオンではないかもしれないが、勧告は、(ローカル宣言)同じまま。 :-)

+0

あなたの答えとniftysnippetsのあなたの記事の両方のTJありがとうございました。これでいくつかのことがクリアされました。 – hummingBird

+0

@playcat:心配しないで、喜んで助けました。ベスト、 –

3

IEといくつかの他のブラウザでは、idを持つ各要素のグローバルスコープ内に参照を追加する傾向があるため、itemの可能性のある理由は既にIEに値を持っている可能性がありますid="item"となります。

あなたが関数内のローカル変数としてitem変数を宣言すると、それはまた、グローバルスコープに存在していることを問題ではない:

var item; 
関連する問題