首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JQuery:如何缓存DOM?

JQuery:如何缓存DOM?
EN

Stack Overflow用户
提问于 2010-01-29 17:05:10
回答 3查看 897关注 0票数 1

我使用Firefug来分析我的web应用程序,发现下面的函数被调用,并且需要被调用,实际上每次用户访问都需要调用数百次。所以我想优化它,因为Firebug说它使用最多的资源/时间。

代码语言:javascript
复制
function highlightChildDiv(parentDiv) {

    /* find the closest (hlisting) home listing to the middle of the scrollwindow & highlight */    
    var scrollElemPos = parentDiv.offset();
    var highlightDiv = $(document.elementFromPoint(
        scrollElemPos.left + parentDiv.width()  / 2,
        scrollElemPos.top  + parentDiv.height() / 2)
    ).closest('#parentDiv div.childClass');

    if (highlightDiv.hasClass("HighlightRow")) { 
        return; // if the div is already highlighted, return
    } else {
        $('#parentDiv div.childClass').removeClass("HighlightRow");
        highlightDiv.addClass('HighlightRow');
    }
}

在我看来,最不优化的语句之一是.closest('#parentDiv div.childClass');,但我相信还有其他需要改进的地方。

问题:考虑到该函数在每次用户访问中运行数百次,是否有人对我如何优化上面的代码有任何JQuery性能提示。

EN

回答 3

Stack Overflow用户

发布于 2010-01-29 17:08:29

首先,删除if子句中的死语句。

代码语言:javascript
复制
if (!highlightDiv.hasClass("HighlightRow")) {  
    $('#parentDiv div.childClass').removeClass("HighlightRow"); 
    highlightDiv.addClass('HighlightRow'); 
} 

在选择器#parentDiv div.childClass中,您能保证div是#parentDiv的直接后代吗?在这种情况下:

代码语言:javascript
复制
.closest('#parentDiv>div.childClass');

代码语言:javascript
复制
$('#parentDiv>div.childClass')

你已经有parentDiv了。我猜这是一个DOM对象,因此您可能可以执行以下操作:

代码语言:javascript
复制
$(parentDiv).children("div.childClass")

只需隐藏当前突出显示的DIV:

代码语言:javascript
复制
$('#parentDiv div.HighlightRow').removeClass("HighlightRow");
票数 1
EN

Stack Overflow用户

发布于 2010-10-28 07:21:07

我猜这是最不优化的路线:

代码语言:javascript
复制
$('#parentDiv div.childClass').removeClass("HighlightRow");

您应该对其进行分析以确保(在调用之外创建一个date对象,并在每次调用前后输出getTime()值)。

在这里,您要求jQuery迭代与选择器匹配的所有DOM元素,并删除该类。如果有1000行,jQuery将需要对每个行进行互操作,以查看是否需要删除类。呃。在这里,删除了该查找:

代码语言:javascript
复制
// namespace scoped cache
var Hash_$_Cache = {
  $parentDiv : $('#parentDiv'),
  $tgt_row   : $([])  // empty jq object to start
};

// find the closest (hlisting) home listing to the middle of 
// the scrollwindow and highlight
//    
var highlightChildDiv = function (parentDiv){
  var
    scrollElemPos = parentDiv.offset(),
    $tgt_row
    ;

  $tgt_row = $(document.elementFromPoint(
    scrollElemPos.left + parentDiv.width()  / 2,
    scrollElemPos.top  + parentDiv.height() / 2)
  ).closest('#parentDiv div.childClass')
  ;

  // bail if row is already highlighted
  if ($tgt_row.hasClass('HighlightRow')){ return; }

  Hash_$_Cache.$tgt_row.removeClass('HighlightRow');
  $tgt_row.addClass('HighlightRow');

  // save highlighted row for later
  Hash_$_Cache.$tgt_row = $tgt_row; // store new row in cache
};

希望这能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2012-12-22 03:51:31

我更喜欢使用以下方法:

https://gist.github.com/3841424#file-domcache-js

或者,您可以在此实现中用方法替换DOM对象:

代码语言:javascript
复制
var myNS = {
    myEventHandler: function(event){
        this.DOM.$el.doSomething();
    },
    cacheDOM: function(){
        return {
             $el: $("#matrix")
        };
    },
    initialize: function(){
        this.DOM = this.cacheDOM();
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2163596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档