【问题标题】:Best way to check element present before binding function in jQuery?在jQuery中绑定函数之前检查元素是否存在的最佳方法?
【发布时间】:2011-07-08 00:18:51
【问题描述】:

我一直在使用以下测试/函数对,以便仅在存在一个或多个时将函数附加到适当的页面元素:

function assistedSearch() {
    $('.assistedSearch').focus( function() {
        ...
    });
}
$(function() {
    if ( $('.assistedSearch').length > 0 ) {
        assistedSearch();
    }
});

function inputHinting() {
    $(':input.hint').each( function() {
        ...
    });
}
$(function() {
    if ( $(':input.hint').length > 0 ) {
        inputHinting();
    }
});

这是过度设计的经典案例吗?每个函数绑定之前的“if”测试是否不必要?

如果不是过度设计,是否有一种较少 DOM 密集型的方法来确保仅将所需的功能绑定到当前页面?

【问题讨论】:

  • 这是毫无意义的,因为 jQuery 默认会处理所有这些,你要做的就是重新检查一遍 :)

标签: jquery performance optimization dom


【解决方案1】:

通过执行您建议的方法,您实际上正在失去性能,因为每个 if 查询 dom 并且您的函数再次发出查询。

function inputHinting() {
    $(':input.hint').each( function() { //query the dom again since it was found.
        ...
    });
}
$(function() {
    if ( $(':input.hint').length > 0 ) { //Query the dom for :input.hint
        inputHinting();
    }
});

jQuery 会为您处理这个问题,因为它会确保元素在对其进行处理之前就已存在。话虽如此,如果你这样做,你应该像下面这样缓存你的选择器:

function inputHinting($inputHint) {
    $inputHint.each( function() { 
        ...
    });
}
$(function() {
    var $inputHint = $(':input.hint');
    if ( $inputHint.length > 0 ) { //Query the dom for :input.hint
        inputHinting($inputHint);
    }
});

这样做你只查询 dom 一次。

【讨论】:

  • 上述“传递”示例中的有趣方法。我是否正确假设如果您最终得到一个零匹配变量(例如,如果 $inputHint 的长度为 0),它将在封装它的“就绪”语句结束时自动从内存中删除?我正在考虑影响性能的内存限制,尤其是在移动设备上。
  • 根据这个答案stackoverflow.com/questions/3396264/…,只要您使用 jQuery 对象进行操作,它就应该跟踪变量并在必要时处理它们。
【解决方案2】:

你不应该真正关心这个。 Jquery 在内部进行检查,因此您不必担心。如果您真的必须出于某种原因检查它,.length 属性将是您的最佳选择。

编辑

另外,你不需要这样做

if ( $(':input.hint').length > 0 ){}

简单地使用下面是等效的

if ( $(':input.hint').length) {} 

【讨论】:

    【解决方案3】:

    试试这个:

    (function(elem)
    {
        if(elem.length>0)
            elem.each( function() 
            {
                ...
            });
    })($(':input.hint'));
    

    所以这将只查询一次dom,然后它将jquery对象集合传递给一个匿名函数并执行它。

    【讨论】:

    • 这似乎对我没有任何帮助;没有迭代,没有错误——什么都没有。不过我喜欢这个主意。
    猜你喜欢
    • 1970-01-01
    • 2011-09-14
    • 2015-10-30
    • 2014-10-20
    • 2014-03-26
    • 2021-09-13
    • 2016-07-02
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多