繁体   English   中英

Javascript运行时间过长

[英]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

删除所有隐藏字段将花费很短的时间。

希望对您有所帮助。

JSFiddle示例

冒着陈述明显的风险; 遍历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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM