http://rubyforge.org/projects/shooting-star/
とりあえず。
やっぱりIEカチカチ
Flashのバージョンをあげるというのもなんなので、いろいろ調査。
どうも、IEの場合、onloadが呼び出されない場合があるっぽい。
http://support.microsoft.com/kb/239638/ja
なのでxhr.rhtmlの110行目あたりを以下のように変更。
101| Event.observe(window, 'load', function(){ 102| setTimeout(ms.connector = function(){ 103| if(ms.connection) return; 104| if(ms.connecting && ms.connecting != 'xhr') return; 105| var form = $("#{iframe_id}-form"); 106| form.uid.value = #{uid.to_json}; 107| form.tag.value = #{tag.to_json}; 108| form.sig.value = #{sig.to_json}; 109| var timerId = setTimeout(ms.connector, 3000); 110| var useragent_is_ie = /*@cc_on!@*/false; 111| if (useragent_is_ie) { 112| $('#{iframe_id}').onreadystatechange = function(){clearTimeout(timerId)}; 113| } else { 114| $('#{iframe_id}').onload = function(){clearTimeout(timerId)}; 115| } 116| form.submit(); 117| }, meteorStrike.getFlashVersion() >= 8 ? 3000 : 0); 118| });
IEだとCometレスポンスのJavaScriptがうまく実行されない
strike.rhtmlの12行目あたりを以下のように修正
7| (function(){ 8| var channel = #{@channel.to_json}; 9| var javascript = #{@javascript.to_json}; 10| var execute = function(){ 11| var useragent_is_ie = /*@cc_on!@*/false; 12| if (useragent_is_ie) { 13| var ms = parent.parent.meteorStrike[channel]; 14| } else { 15| var ms = (parent.meteorStrike || parent.parent.meteorStrike)[channel]; 16| } 17| if(ms) ms.evaluate(javascript, location.hash.slice(1)); 18| else setTimeout(execute, 0); 19| }; 20| execute(); 21| })();
あと、ココを読んでxht.rhtmlの50行目あたりを以下のように修正。
49| ms.evaluate = function(js, serialId){ 50| serialId = parseInt(serialId); 51| serialId = isNaN(serialId) ? 0 : serialId; 52| if(ms.executionCounter == null){ 53| ms.executionCounter = serialId; 54| } 55| ms.executionQueue[serialId] = js;
動いてはいるので、元に戻した。
追記
処理の遅れが気になるので、xht.rhtmlの67行目あたりを以下のように修正。
61| setTimeout(function(){ 62| if(js = ms.executionQueue[this]){ 63| eval(js); 64| delete ms.executionQueue[this]; 65| ms.executionCounter = null; 66| } 67| }.bind(serialId), 0);