2011-11-08 7 views
0

私はZend Frameworkアプリケーションを持っています。 IE8とjQueryに問題があるようですが、これはいくつかの(多くの)投稿の後に終わります。つまり、ポストの量が増えるにつれて悪化します。何が起こっているのか、ページをリロードせずにデータ入力をしている間に、ページをリロードしたりリロードしようとすると、IE8は本当に奇妙な/不快な/動揺した動作をします。ページを読み込みます。私がそこからリロードすると、それはリセットされ、すべてがしばらくの間うまく動作し、ビルドして再び起こります。IE8 jQuery AJAX weirdness

IE8でいくつか他のタブが開いているとしましょう - アプリケーションの別のページに移動しようとすると、IE8はリロードする前にもう少しタブとフリッカーを表示しますページを表示して表示します。私がこの時点でリロードすると、通常はあなたが期待することをします。私がこの時点でリロードしないと、次回に悪いことが増えてリロードしようとすると、IE8はこれ以上試してはいけないと言います。そして、ナビゲーションバーに手動でURLを入力しなければなりませんアプリケーションに戻ります。

私はそれが私のキー押下拘束と関係していると感じていますが、私はなぜそれがわかりません。他の誰かがこれを経験して、何がうまくいかないのか考え出しましたか?結合キー入力が発生したのはここ

は私 $(document).ready()機能です:

$(document).ready(function(){ 

    running = false; 
    offset = $("#quantity").html(); 

    $("#boxNumber").focus(); 

    $(document).bind("keypress" , function(e){ 
     var firstName = document.getElementById('firstName'); 
     var middleName = document.getElementById('middleName');   
     if (e.which == 13 && (!$("#notes").is(":focus")) && (!$("#submit").is(":focus"))) { 
      if (running == false) { 
       running = true; 
       middleName.value = middleName.value.toUpperCase(); 
       firstName.value = firstName.value.substring(0, 1).toUpperCase() + 
            firstName.value.substring(1, firstName.value.size); 
       submitForm(); 
       return false; 
      } else { 
       return false; 
      } 
     } else if (e.which != 13 && $("#middleName").is(":focus") && $("#middleName").val() != '') { 
      firstName.focus(); 
      firstName.value = firstName.value + " " + middleName.value.toUpperCase(); 
      middleName.value = ''; 
     } 

    }); 
    bindTdClick(); 
    bindAutoComplete('oof_name'); 
    bindAutoComplete('pro_title'); 
    bindAutoComplete('tags'); 


    $("#submit").click(function(){ 
     if (running == false) { 
      running = true; 
      submitForm(); 
     } else { 
      return false; 
     } 
    }); 
}); 

問題もsubmitForm()機能であることmght:

function submitForm() { 
    $.post("/ajax/files" , $("#files").serialize(), function(data){ 
     filesReset(); 
     if (data != "") { 
      $("#lastInsert table tbody:last").prepend(data); 
      $("#lastInsert table tbody:last tr:first").find("td").hide(); 
      $("#lastInsert table tbody:last tr:first").find("td").fadeIn(1000, function(){ bindTdClick(); }); 
      $("#lastInsert table tbody:last tr:first").effect("highlight" , {"color": "aqua"}, 1000); 

      $("#lastInsert table tbody:last tr:last").remove(); 
     } else { 
      alert("Insert rejected by the server: either inadequate criteria or the server is down."); 
      $("#hidden").click(); 
     } 
     running = false; 
    }); 
} 

または多分filesReset()機能:

function filesReset(){ 
    var lastName = $("#lastName").val(); 
    if (lastName.indexOf(',') != -1) { 
     lastName = lastName.substring(0, lastName.indexOf(',')); 
    } 
    $("#lastName").val(lastName).focus().select(); 
    $("#firstName").val(""); 
    $("#middleName").val(""); 
    $("#fil_will_recorder_rec_id").val(""); 
    $(".errors").remove(); 
    $("#lastInsert table").css({"border-right":"1px solid #D9D9D9"}); 
    $("#notes").val(""); 
    //$("#tags").val(""); 
    $("span").html(""); 
} 
+1

私はこれ以上良く分からないので、私は推測します。 – tjb1982

+0

おそらくjQueryはjsですか?ネイティブのjavascriptは、ほとんどの場合、実際にはより高速です。どのような質問が... – SteamDev

+0

一見して、間違っているとは見えませんが、あなたのコードのある時点で何かが何度も何度も同じアクション(おそらくkeypress)にバインドされていると思われます。いくつかのアラートやファイアウォールのブレークポイントを追加して、どのセグメントが繰り返し呼び出されているかを確認し、テストのためにIEに戻ることができます。 – Dave

答えて

0

DOMにかなり重いあなたがキーを押すたびに毎回のccess。あなたがテーブルの重いアプリを持っているなら、おそらくIE8のDOM操作の難しいエンドウ豆の頭が爆発して物事を整理しようとしているのです。

ぼかしやフォーカスのイベントをより効果的にするような自動書式設定をしているようです。それをコメントアウトすると、それが原因であることが判明した場合、キー押しから移動してください。

最初の条件のものは2番目のヒットにはなりません。=== 13チェックが失敗して、うまくいくはずです。

修正することはできませんが、傷ついていないもう一つの改善点は、HTMLがリッピングされずに戻ってこない場合に、これらのjQuery選択項目をすべてキャッシュすることです。他の何かをする前にvarsに複数回アクセスしてください。例えば

var $_someId = $('#some_id'); 

IDは実際には本当に高速ですが、より複雑な選択肢には大きな違いがあります。 jQueryがちょうどフードの中で使っている通常のDOM APIメソッドについても同じことが言えます。