大津です。 あっ、見逃してました。コールバック関数の中なので this はグローバルになり ますね。僕もよく間違えます。(反省)
で、該当のところを blame してみたら、guille が意図的に修正していたようです。 https://github.com/LearnBoost/socket.io-client/commit/b69d5e5ccbeef69930073e18b524f3ef3ebac698 Opera 向けの対応で window オブジェクトの readyState を見るように変更した けど IE6 では onreadystate イベントは未サポートなんで node- XMLHttpRequest モジュールでエミュレートすることになり、window.readyState が undefined になったというオチなんでしたか。 quick hack なら OR で両方チェックするのが一番簡単ですが、ちゃんと根本的 に直すなら https://github.com/driverdan/node-XMLHttpRequest/blob/master/lib/XMLHttpRequest.js#L533-547 のあたりに手を入れる必要があるんでしょうね。 (2012/08/29 22:14), neino-3 wrote: > to:大津さん > > neino-3です。 > コメントありがとうございます。 > > ご指摘頂いた箇所、 > if (self.sendXHR.readyState == 4) { > に修正するとIE6でもreadyStateの値を確認できました。 > ありがとうございました。 > stateChange()の中thisを使ってるところを同様に修正してとりあえず > IE6で動くことを確認できました。 > # 私自身javascript歴浅いもので、全てselfに変えてしまってよいものか > # もう少し勉強します。。。 > > 今日は時間が確保できずこれだけしか確認できなかったのですが、 > 他のブラウザでデグレードしないかもう少し検証して、 > できればpull requestしてみたいと思います。 > > 2012年8月29日水曜日 1時12分19秒 UTC+9 shigeki: > > 大津です。 > > IE6の環境は手元にないので実際に試せないのですが… > > > 私の環境で調査したところ、socket.io-client のxhr.jsの以下の部分で、 > > this.readyStateがIE6の場合 > > undefinedで入ってきました。このため期待した分岐に入っていないのが > 原因っ > > ぽい気がしています。 > > ちょっとコードをざっと断片的に見ただけなんですが、 > > this.sendXHR.onreadystatechange = stateChange; > > でハンドラを登録しているので readyState プロパティを管理しているのは > this (=XHR) ではなく、this.sendXHR じゃないのかなぁと思ったりします。 > > 実は this.sendXHR.readyState に値が入ってたりしませんかね? > (チェックしてもらえればすぐわかりますが) > > 違ってたら実機でデバッグ頑張って下さいねとしか言えませんけど… > (でもこれが合っていても他にも地雷が埋まっていそうな感じ。) > > (2012/08/28 23:11), neino-3 wrote: > > neino-3と申します。 > > > > IE6でSocket.IOを使って通信方式をhtmlfileにした場合に > > 期待した動きにならず修正方法を検討しております。 > > > > 自分の環境だけの問題ではなく、皆様の環境でも > > 発生する事象なのか念のため確認させて頂きたくメールさせて頂きました。 > > # socket.io <http://socket.io>のMLにも投げてみたのですが、私の英 > 語がイマイチなのかもしれな > > い&IE6で > > # 使っている人がいないのかリアクションがなかったため、こちらに投 > 稿させて > > 頂いた次第です。 > > > > 問題の検証コードは以下に置いています。 > > https://github.com/neino3/socket.io-client-htmlfile-ie6-problem > <https://github.com/neino3/socket.io-client-htmlfile-ie6-problem> > > > > 検証コードは、 > > ・ページに配置したボタンが押されたらサーバに対してメッセージを > sendする > > ・サーバは、クライアントからメッセージを受け取ったらコンソールに > 出力する > > という、単純なsocket.io <http://socket.io>のプログラムです。 > > > > これをIE6で動かした際、transportはhtmlfileで動きます。 > > 1回目のsendは成功し、サーバ側コンソールにメッセージが表示されます。 > > しかし、2回目以降はボタンを押してsendが呼ばれてもサーバへはメッ > セージが > > 送信されませんでした。 > > IE6環境をお持ちの方がいらっしゃいましたら、上記検証コードで同様の > > 現象になるか確認してみて頂けないでしょうか? > > # もしご確認いただける場合はsocket.io-client 0.9.10でお願いします。 > > # 0.9.10 以前のバージョンだと別のバグが原因でIE6でhtmlfileが動き > ません。 > > > > > 私の環境で調査したところ、socket.io-client のxhr.jsの以下の部分で、 > > this.readyStateがIE6の場合 > > undefinedで入ってきました。このため期待した分岐に入っていないのが > 原因っ > > ぽい気がしています。 > > > > https://github.com/LearnBoost/socket.io-client/blob/master/lib/transports/xhr.js#L101 > > <https://github.com/LearnBoost/socket.io-client/blob/master/lib/transports/xhr.js#L101> > > > > > よろしくお願い致します。 > > > > -- > > > > > > > > -- > > > --
