javascript - Mootools的removeClass在IE上非常慢

标签 javascript mootools

我在mooTools中的同一组元素上应用addClass和removeClass。addClass工作正常,但removeClass需要太长的时间大约6-7秒。请参阅下面的代码。

    $('usermailbox').getElements('input[class=emailmessages]').each(function(el){
            el.getParents().addClass('unChecked');//works fine
    }); 

    $('usermailbox').getElements('input[class=emailmessages]').each(function(el){
            el.getParents().removeClass('selected'); //Takes too long in IE
    });

我还有希望吗?

最佳答案

对。这里有几个问题......显然,在没有看到 DOM 的情况下很难确定,但是:

  1. 您执行相同的操作两次。在同一个实例中,您可以添加类和删除类

  2. 执行 element.getElements("input[class=emailmessages]")element.getElements("input.emailmessages") 可能会更慢,但可能会返回包含您可能不想要的其他类的输入。

  3. el.getParents() 将返回所有父级。然后你再次迭代它们。两次。你确定你的意思不仅仅是.getParent(),单数吗?如果是这样,或者如果它只有一个父元素,那么您将在单个元素上应用 .each,这是不必要的命中。

  4. 如果您的逻辑需要保留,那么请将其视为一次迭代:

储存并步行。

var parents = el.getParents(); 
parents.each(function(p) { 
    p.addClass("unchecked").removeClass("selected"); 
});

总而言之:

$("usermail").getElements("input.emailmessages").each(function(el) {
    var parents = el.getParents(); 
    parents.each(function(p) { 
        p.addClass("unchecked").removeClass("selected"); 
    });

});

当然,使用 Slick/mootools 1.3 你可以做得更简单:

在此 dom 上:

<div id="usermailbox">
    <div class="selected">
        <input class="emailmessages" />
    </div>
    <div class="selected">
        <input class="emailmessages" />
    </div>
    <div class="selected">
        <input class="emailmessages" />
    </div>
</div>

以下将返回所有 div:

// gets parents via a reverse combinator. you can do !> div or whatever to be more specific
// document.getElements("#usermailbox input.emailmessages !") will return all parents...
// ... in a single statement, inclusive of body, html etc... same as getParents
var divs = document.id("usermailbox").getElements("input.emailmessages !> "); 
// single iteration per parent:
divs.each(function(div) {
    div.removeClass("selected").addClass("unChecked");
});

当然,您可以随时执行 $("useremail").getElements("div.selected,div.unChecked") 来访问这些 div...这一切都取决于您的 DOM 和需求,您所做的事情必须有一个原因。

性能底线:

  • 将查找结果缓存到变量中。如果您调用 $("someid") 两次,请将其缓存在您的作用域中。如果你执行 $("someid").getElements() 两次,那么性能会差两倍以上......并且添加 .getParents() 两次,那就是。 ..现在糟糕了n倍...

  • 避免对集合应用 chaqined 方法,如下所示:collection.addClass("foo").removeClass("bar") - 它将迭代两次或 n 次,请选择相反,使用单个 .each 回调,速度会快得多。

  • 如果可能的话,尽量避免反向组合器或父级查找,直接进行。您可以使用 nth-child 等 - 除了到达输入并返回之外,还可以使用其他方式来遍历 DOM。特别是当您并不真正需要输入本身时......

  • .getParents(selector) 将限制您想要的父项类型。 .getParents() 将返回负载,一直到父/ anchor dom 节点,通常包括与兄弟节点相同的负载。

  • 始终使用匿名函数创建本地作用域,这样就不会污染全局对象或上层作用域 - IE 不喜欢这样,并且会使访问变量变慢。

希望其中一些是有道理的,至少:)祝你好运并记住,速度只是相对的,并且与你在支持的最慢浏览器中的性能一样好。

关于javascript - Mootools的removeClass在IE上非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6911510/

相关文章:

javascript - 仅在用户编辑内容时显示 TinyMCE 控件

javascript - 如何使用 ionic 检查配置文件是否存在于 firebase 中?

javascript - 在 MooTools 中使用 getSelected

javascript - Mootools 周期函数和时间倒带

javascript - Angular-UI $scope.myMap 未定义

javascript - 如何更新值以便 Mobx 进行渲染?

javascript - 对对象中的数字键进行排序

javascript - 使用 Javascript 和 mootools 附加到动态创建的 div

javascript - ClearBox 3 jQuery.noConflict();和/或 javascript 冲突?

javascript 获取最后一个不带前缀的 url