我有一个js代码,它根据ajax响应的类型重置jsp上元素的值。代码为所有元素运行for循环;获取近800-900个元素的所有元素。 IE 8为无响应的脚本提供恼人的弹出消息。我已经阅读了很多关于它的文章,但到目前为止还没有任何帮助,或者我无法实现解决问题。
以下是导致弹出的代码。
function clearField(ele,eleType)
{
if(eleType=="checkbox")
{
ele.prop('checked', false);
}
else if(eleType=="text")
{
ele.val("");
ele.removeAttr('disabled');
ele.removeAttr('readonly');
}
else if(eleType=="radio")
{
if(ele.is(':checked'))
{
ele.prop('checked', false);
}
}
else if(eleType=="multiple")
{
if(ele.data('echMultiselect')!==undefined)
{
ele.multiselect("uncheckAll");
ele.multiselect("refresh");
}
}
else if(eleType=="hidden")
{
ele.val("");
}
else
{
ele.val("Select");
ele.removeAttr('disabled');
ele.removeAttr('readonly');}
}
上面的函数被调用for循环迭代。 ele被提取如下并传递给函数。
var ele = $("input[name='"+ elementName+"']");
请建议是否可以进行任何改进,或者可以使用任何其他方法来实现相同的目标。
答案 0 :(得分:0)
无响应的脚本弹出窗口是由长时间运行的功能引起的。这会阻止javascript的单线程事件循环并使页面无响应,直到函数退出。如果异步运行clear,则不会阻止事件循环。例如,您可以使用setImmediate(clearField.bind(null,ele,eleType))替换clearField(ele,eleType)。这是一个快速入侵,可以释放事件循环并阻止弹出窗口显示,但不能解决下面的性能问题。
DOM访问是一项昂贵的操作,如果可能的话,应该避免访问数百个元素。如果您的用例总是将所有字段重置为默认阶段,我建议您使用所有元素的looooong HTML字符串,并调用$(parent).html(htmlString)来设置元素。这样你只需要一个DOM访问,效果是即时的。