[英]Javascript taking too long to run
我的脚本运行时间过长,这导致我出现此错误,即:此页面上的脚本导致Internet Explorer运行缓慢。
我已经阅读了有关此错误的其他线程,并且了解到有一种方法可以通过在一定数量的迭代后超时来绕过它。
您能帮我在以下功能上申请超时吗?
基本上,每次我找到要删除的类型为commit或radio的隐藏输入时,就会发现它们很多。 请不要怀疑为什么我有很多隐藏的输入。 我做到了,因为我需要它只是帮助我超时,所以我不会出现JS错误。 谢谢
$('input:hidden').each(function(){
var name = $(this).attr('name');
if($("[name='"+name+"']").length >1){
if($(this).attr('type')!=='radio' && $(this).attr('type')!=='submit'){
$(this).remove();
}
}
});
我发现的示例之一: 使用setTimeout绕过IE的长时间运行的脚本警告
您可能想将input
添加到jquery选择器中,以仅过滤出输入标签。
if($("input[name='"+name+"']").length >1){
这是使用setTimeout()
尚未(尚未)优化的同一代码:
var $hidden = $('input:hidden'),
el;
for (var i = 0; i < $hidden.length; i++) {
el = $hidden[i];
if(el.type!=='radio' && el.type!=='submit'
&& $("[name='" + el.name + "']").length >1) {
$(el).remove();
}
}
注意,现在每个迭代最多可以有三个函数调用,而原始代码每个迭代最多可以有十个函数调用。 只需说出this.type
(无函数调用),就不需要$(this).attr('type')
(两个函数调用)了。
此外, .remove()
仅在满足三个条件的情况下才会发生,这两个type
进行测试并检查是否具有相同名称的其他元素。 首先进行type
测试,因为它们很快,并且只有在type
部分通过的情况下,才需要对其他元素进行慢速检查。 (如果左侧的操作数不正确,JS的&&
不会评估右侧的操作数。)
或使用setTimeout()
:
var $hidden = $('input:hidden'),
i = 0,
el;
function doNext() {
if (i < $hidden.length) {
el = $hidden[i];
if(el.type!=='radio' && el.type!=='submit'
&& $("[name='" + el.name + "']").length >1) {
$(el).remove();
}
i++;
setTimeout(doNext, 0);
}
}
doNext();
您可以通过更改$("[name='" + el.name + "']")
来指定特定的元素类型来改进任一版本,例如,如果您仅在使用输入,则使用$("input[name='" + el.name + "']")
。 同样,您可以限制某个容器,例如,如果这些输入全部为某种形式或某种形式。
看来您引用的示例正是您所需要的。 我认为,如果您拿起代码并替换示例中的while
循环(保留if
语句以检查批处理大小),则基本上已经完成。 您只需要打破循环的jQuery版本即可。
尝试这个:
$("[type=hidden]").remove(); // at the place of each loop
删除所有隐藏字段将花费很短的时间。
希望对您有所帮助。
冒着陈述明显的风险; 遍历DOM寻找与这些CSS选择器的匹配项是使您的代码变慢的原因。 您可以通过一些简单的技巧来减少工作量:
这些字段是否在特定元素内? 如果是这样,您可以通过在选择器中包含该元素来缩小搜索范围。
例如:
$('#container input:hidden').each(function(){
...
您还可以缩小检查name
属性的字段数
例如:
if($("#container input[name='"+name+"']").length >1){
我也不清楚为什么找到隐藏元素后,为什么要再次使用$("[name='"+name+"']").length >1
。 您没有解释该要求。 如果您不需要它,则可以通过将其取出来大大加快该过程。
$('#container input:hidden').each(function(){
var name = $(this).attr('name');
if($(this).attr('type')!=='radio' && $(this).attr('type')!=='submit'){
$(this).remove();
}
});
如果您确实需要它,我很想知道为什么,但是最好的方法可能是重组代码,以便它只检查一次给定名称的输入数量,并一次性删除所有输入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.