我正在开发一个已经存在多年的遗留项目(在Rails 3.1之前),因此它在整个地方都有Prototype和jQuery,以便在jQuery中重写所有Prototype。
我正在研究自动填充样式下拉列表的问题,该问题将使用一些数据填充DOM中的某个区域。这工作正常,但此自动完成的某些实例具有项目限制。因此,在添加数据时,它会检查某个选择器是否超过N并删除最后一个。
我这样做的功能很简单:
function remove_items(num, selector) {
while (selector.length >= num) {
selector[selector.length-1].remove()
}
};
我传入限制和使用jQuery选择的对象数组,我希望有一个限制。
问题似乎是,选择器中的元素上的.remove()将使用Prototype方法将其从DOM中删除,即使它是一个jQuery对象。然后,因为选择器数组没有被更改,循环再次使用prototype方法运行并且它抛出一个错误,因为现在该元素不在DOM中。
我在循环之前做了一个选择器长度的计数变量,并且每次减少一次,但显然这是一个不太理想的解决方案。
任何人都知道为什么会这样或者如何阻止它发生?
答案 0 :(得分:1)
如果selector
是本机数组,则只需使用以下内容将其截断为num
项:
selector.splice(num);
如果selector
是一个jQuery对象,那么尝试就地修改它是不好的做法 - 其他jQuery函数返回一个 new jQuery对象,即
selector = selector.slice(0, num);
请注意,在后一种情况下,将此代码包装在函数中是没有意义的,如果您这样做,则必须return
新对象,而不是依赖于被修改的传递参数 - 的地方。
答案 1 :(得分:0)
您可以使用var jQuery=jQuery.noConflict()
来避免干扰
答案 2 :(得分:0)
这根本不是jQuery.noConflict()
。
jQuery的.remove()
旨在从DOM中删除项目,而不是从数组中删除。使用.not()
方法,您可以从集合中删除项目。
请参阅:http://api.jquery.com/remove/& /不/
所以代码将成为:
function remove_items(num, selector) {
while (selector.length >= num) {
selector = selector.not(':last');
}
};
如果您还想从DOM和数组中删除元素:
function remove_items(num, selector) {
while (selector.length >= num) {
selector.remove(':last');
selector = selector.not(':last');
}
};
的jsfiddle: http://jsfiddle.net/h46WT/1/