チャットを模したシンプルなアプリです。私はjsfiddleを提供します:
http://jsfiddle.net/LkqTU/2785/
ボタンによってシミュレートされたサーバーからのいくつかのメッセージと、ユーザーがキーを取得してメッセージを送信するために keypress イベントにバインドされたテキストエリアに入力します。
これは Chrome と Firefox では問題なく動作しますが、IE9 では失敗します。
何が間違っている可能性がありますか?
ありがとう
チャットを模したシンプルなアプリです。私はjsfiddleを提供します:
http://jsfiddle.net/LkqTU/2785/
ボタンによってシミュレートされたサーバーからのいくつかのメッセージと、ユーザーがキーを取得してメッセージを送信するために keypress イベントにバインドされたテキストエリアに入力します。
これは Chrome と Firefox では問題なく動作しますが、IE9 では失敗します。
何が間違っている可能性がありますか?
ありがとう
まあ、エラーを見つけるのは比較的簡単でした: Model 関数の最初にある右のthis
名前の外部変数への代入は、self
正しくないように見えます。
Chrome と Firefox では問題なく動作したが、IE では失敗した理由の説明は、はるかに興味深いものです。明らかに varlessself
は を参照しますwindow.self
が、これは実際にはオブジェクトの特別なプロパティであり、window
...window
自身への参照 ( MDN ) です。
Internet Explorer は、このプロパティの特定の処理で実際によく知られています。他のブラウザでwindow === window.self
は に評価されますがtrue
、IE ではfalse
です。そして、IE が何の理由もなくそれを行うとは言いません。詳細については、このディスカッションを確認してください。
皮肉なことに、この特定の例では、IE が半分のヒーローであることが判明しました。) 「ヒーロー」と言ったのは、IE が上書きを許可しない唯一のブラウザーだからですwindow.self
。他のすべてはそれほどうるさいわけではありません。スクリプトの最後に追加console.log(window.self)
して、彼らの恥を目撃してください。)
私が「半分」と言ったのは、IE の方がはるかに... 英雄的である可能性があるからです。)window.self = ...
行を黙って無視する (そして、無視された代入を少し異なる方法で使用した遠く離れた行に対してエラーをスローする) 代わりに、なぜ IE は早期警告を出さなかったのですか? くそー、通知でもいいです。
ともかく。そのようなことを IE の散発的なヒロイズムに頼らないようにするのはとても簡単'use strict'
です。スクリプトの最初に行を追加するだけで、出来上がりです! Chrome と Firefox の両方が、それが属する場所 (行) で「参照エラー」警告を吐き出しself = this
ます。)
はい、「use strict」の使用は単純な手順ではなく、一部のスクリプトが壊れる可能性があることを理解しています。それでも私は、そのトピックに関するニコラス・ザカスの声明を完全に支持します。