1

我正在处理一个已经存在多年的遗留项目(在 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 对象。然后,因为选择器数组没有改变,循环再次使用原型方法运行并抛出错误,因为现在元素不在 DOM 中。

我在循环之前创建了一个选择器长度的计数变量,并每次将其减少一个,但显然这是一个不太理想的解决方案。

任何人都知道为什么会发生这种情况或如何阻止它发生?

4

3 回答 3

1

如果selector是本机数组,您可以num使用以下方法将其截断为项目:

selector.splice(num);

如果selector是 jQuery 对象,尝试就地修改它是不好的做法 - 其他 jQuery 函数返回一个的jQuery 对象,即

selector = selector.slice(0, num);

请注意,在后一种情况下,将此代码包装在函数中几乎没有意义,如果这样做,您将不得不return使用新对象,而不是依赖于就地修改传递的参数。

于 2013-05-15T14:26:10.517 回答
0

你可以var jQuery=jQuery.noConflict()用来避免干扰

有用的参考:用“JQuery”替换“$”(美元符号)

于 2013-05-15T14:02:47.840 回答
0

这根本不是关于jQuery.noConflict()

jQuery 的.remove()目的是从 DOM 中删除项目,而不是从数组中。使用该.not()方法,您可以从收藏中删除项目。

见:http ://api.jquery.com/remove/ & /not/

所以代码会变成:

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/

于 2013-05-15T14:04:33.300 回答