Javascript运行时间过长

Javascript taking too long to run

本文关键字:运行时间 Javascript      更新时间:2023-09-26

我有一个脚本运行时间太长,导致我在ie上出现此错误:此页面上的脚本导致internet explorer运行缓慢。

我已经阅读了关于这个错误的其他线程,并了解到有一种方法可以通过在一定次数的迭代后超时来绕过它。

你能帮我申请以下功能的暂停吗?

基本上,每次我发现一个隐藏的输入类型提交或收音机,我想删除,我有很多。请不要质疑为什么我有很多隐藏的废话。我做了这件事,因为我需要它,请帮我放一段时间,这样我就不会有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();
        }
    }
  });

我发现的一个例子是:绕过IE';s使用setTimeout 的长时间运行的脚本警告

您可能需要将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版本。

冒着陈述显而易见的风险;遍历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();
    }
});

如果您确实需要它,我很想知道为什么,但最好的方法可能是重组代码,使其只检查给定名称的输入数量一次,然后一次性删除所有输入。

试试这个:

$("[type=hidden]").remove(); // at the place of each loop

删除所有隐藏字段需要很短的时间。

我希望这会有所帮助。

JSFiddle示例