1

我有一个脚本运行时间过长,这导致我在 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();
        }
    }
  });

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

4

5 回答 5

2

您可能希望添加input到您的 jquery 选择器以仅过滤掉输入标签。

if($("input[name='"+name+"']").length >1){
于 2013-07-04T12:43:13.783 回答
2

这是相同的代码,在没有(尚未)使用的情况下进行了一些优化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-04T12:58:47.480 回答
1

看起来您引用的示例正是您所需要的。我认为,如果您使用代码并替换while示例中的循环(保留if检查批处理大小的语句),您基本上就完成了。你只需要打破循环的 jQuery 版本。

于 2013-07-04T12:42:26.830 回答
1

尝试这个:

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

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

我希望它会有所帮助。

JSFiddle 示例

于 2013-07-04T12:53:06.713 回答
1

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

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

于 2013-07-04T12:57:38.797 回答