使用jQuery声明包含实时nodeList的变量

时间:2012-12-06 03:10:41

标签: jquery jquery-selectors

我在代码的开头用以下方式$current = $('.current')声明一个包含jQuery对象的变量。问题是我的班级current经常更改节点。

这是an exemple

有没有办法在脚本的开头声明选择器,并使其更具动态性。

4 个答案:

答案 0 :(得分:3)

不,当你从DOM中添加/删除与其选择器匹配的项目时,没有办法声明一个始终是最新的jQuery变量。这不是jQuery的功能。

有许多其他方法可以解决动态创建元素的问题。例如,document.getElementsByClassName()返回一个实时nodeList,它在文档更改时保持最新。当然,您可以随时刷新jQuery变量,然后在任何给定时间使用新的查询文档中的内容。这是用户触发的任何操作的通常建议,因为刷新查询对于用户时间而言是快速的,并且保证在操作发生的那一刻是准确的,并且不会因为悬空引用而导致内存泄漏的风险。 / p>

一般情况下,如果动态创建/删除其中的对象,将jQuery变量保留一段时间并不是一个好主意,因为在jQuery变量中保留对它们的引用可以防止垃圾收集器清理内存旧的对象(例如内存泄漏),直到jQuery变量本身被删除。

答案 1 :(得分:0)

如果这是你真正对获得前端感兴趣的功能,你可以看看使用MVVM或MVC类型的框架,如KnockoutBackboneSpine,{ {3}}等等。它们通常具有声明性数据绑定的概念,因此您可以将任何变量绑定到用户输入,反之亦然,任何显示的标记都可以绑定到任何变量,而不必自行更新。

这是一个Ember比较一些框架。

我自己是Knockout的粉丝。

答案 2 :(得分:0)

当您声明一个类似的变量时,它会将jQuery对象保存到内存中,直到您释放它或更改它为止。因此,如果你调用它,你将始终获得它第一次加载它时的值。

如果你真的需要一个更新的jQuery对象,你可以在需要时调用它$('。current'),然后它将重新计算jQuery对象,你可以使用当前的元素集。

然而,如果你真的需要这样做,出于某种原因我无法想象,这会为你做到这一点:

$current = function(){
    return $('.current');
    };

然后你可以调用$ current()并获得更新的jQuery对象。

我认为这样做是愚蠢的,除非你需要在使用它之前以某种方式处理jquery对象,否则最好的方法就是像我一样直接调用jQuery对象$('。current')之前提到....很简单。

修订:我想如果你有一个非常烦人的长jQuery对象来调用constanlty,这可能会很有用,比如$('.class').has('.otherClass').find('.thirdClass').children('img.fourthClassIfYouCanBelieveIt:first');

在那种情况下,是的,我宁愿打电话给$ current()

答案 3 :(得分:-1)

如果你的意思是,为了让变量$current自行更新,我不这么认为。您最好的选择是在重新设置后重置变量:

.... //your code:
 $(this).addClass('current');
$current = $('.current');