jQuery和Prototype方法相互干扰

时间:2013-05-15 13:50:31

标签: javascript jquery dom prototypejs

我正在开发一个已经存在多年的遗留项目(在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中。

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

任何人都知道为什么会这样或者如何阻止它发生?

3 个答案:

答案 0 :(得分:1)

如果selector是本机数组,则只需使用以下内容将其截断为num项:

selector.splice(num);

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

selector = selector.slice(0, num);

请注意,在后一种情况下,将此代码包装在函数中是没有意义的,如果您这样做,则必须return新对象,而不是依赖于被修改的传递参数 - 的地方。

答案 1 :(得分:0)

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

有用的参考:Replace "$"(dollar Sign) with "JQuery"

答案 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/