IE8 jQuery AJAX很奇怪

时间:2011-11-08 15:32:32

标签: jquery ajax jquery-ui

我有一个Zend Framework应用程序。我似乎遇到了IE8和jQuery的问题,在几篇(很多)帖子后达到高潮。也就是说,随着帖子数量的增加,情况会变得越来越糟。发生的事情是,经过一段时间没有重新加载页面进行数据输入,如果我试图导航或重新加载页面,IE8行为真的很怪异/毛躁/狡猾,有时会告诉我它已经尝试了所有它可以做并将停止尝试加载页面。当我从那里重新加载它重置并且一切正常工作一段时间,直到它积累并再次发生。

为了解释一下发生了什么,让我说我在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()功能:

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 个答案:

答案 0 :(得分:0)

每次敲击密钥时,DOM访问都非常重要。如果你有一个表格繁重的应用程序,它可能使IE8的可怜的小DOM操纵挑战的豌豆头爆炸试图解决问题。

在我看来,你正在做一些自动格式化的东西,这对于在= = 13条件下的按键上的模糊或焦点事件更有意义。如果将其评论出来,那么将其从按键移开会发现它是罪魁祸首。

第一个条件下的东西不会被击中第二个=== 13检查失败,所以应该没问题。

另一个可能不会修复但不会受到影响的提升功能是在HTML没有被删除并重新放入的情况下缓存所有这些jQuery选项。只需在播放中分配所有永久jq对象在做任何其他事情之前,不止一次访问vars。 e.g。

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

ID实际上非常快,但它可以为更复杂的选择带来很大的不同。对于jQuery刚刚在幕后使用的常规DOM API方法也是如此。