2

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

这是一个例子

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

4

4 回答 4

3

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

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

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

于 2012-12-06T03:14:34.697 回答
0

如果这是您真正有兴趣为您的前端获得的功能,您可以考虑使用 MVVM 或 MVC 类型的框架,如KnockoutBackboneSpineEmber等。它们通常具有声明性数据绑定的概念,所以您可以将任何变量与用户输入联系起来,反之亦然,将任何显示的标记与任何变量联系起来,而无需费心更新自己。

这是一篇比较一些框架的优秀文章。

我自己是 Knockout 的粉丝。

于 2012-12-06T03:29:23.807 回答
0

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

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

但是,如果由于某种我无法想象的原因你真的需要这样做,这对你有用吗:

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

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

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

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

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

于 2012-12-06T03:32:19.003 回答
-1

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

.... //your code:
 $(this).addClass('current');
$current = $('.current');
于 2012-12-06T03:14:56.690 回答