我有一个运行时间太长的脚本,这导致我在ie上出现这个错误:这个页面上的一个脚本导致internet explorer运行缓慢。
我已经阅读了关于这个错误的其他线程,并了解到有一种方法可以通过在一定次数的迭代后设置一个超时来绕过它。
你能帮我在下面的函数上申请一个超时时间吗?
基本上,每次我发现一个隐藏的提交或单选类型的输入时,我想要删除它们,并且我有很多这样的输入。请不要质疑为什么我有很多隐藏的输入值。我做了bc,我需要它,只是帮我把时间放出来,这样我就不会有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();
}
}
});我找到的一个例子是:Bypassing IE's long-running script warning using setTimeout
发布于 2013-07-04 20:43:14
您可能希望将input添加到jquery选择器中,以便只过滤出输入标记。
if($("input[name='"+name+"']").length >1){发布于 2013-07-04 20:58:47
下面的代码在没有使用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).attr('type') (无函数调用)时,就没有必要使用this.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 + "']")进行输入。你也可以受一些容器的限制,例如,如果这些输入都在一个表单或其他什么东西中。
发布于 2013-07-04 20:42:27
看起来你引用的例子就是你所需要的。我认为,如果您将代码替换为示例中的while循环(保留用于检查批处理大小的if语句),那么基本上就完成了。您只需要jQuery版本的中断循环即可。
https://stackoverflow.com/questions/17470458
复制相似问题