我有一个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("");
}
答案 0 :(得分:0)
每次敲击密钥时,DOM访问都非常重要。如果你有一个表格繁重的应用程序,它可能使IE8的可怜的小DOM操纵挑战的豌豆头爆炸试图解决问题。
在我看来,你正在做一些自动格式化的东西,这对于在= = 13条件下的按键上的模糊或焦点事件更有意义。如果将其评论出来,那么将其从按键移开会发现它是罪魁祸首。
第一个条件下的东西不会被击中第二个=== 13检查失败,所以应该没问题。
另一个可能不会修复但不会受到影响的提升功能是在HTML没有被删除并重新放入的情况下缓存所有这些jQuery选项。只需在播放中分配所有永久jq对象在做任何其他事情之前,不止一次访问vars。 e.g。
var $_someId = $('#some_id');
ID实际上非常快,但它可以为更复杂的选择带来很大的不同。对于jQuery刚刚在幕后使用的常规DOM API方法也是如此。