Javascript jQuery和原型方法相互干扰

Javascript jQuery和原型方法相互干扰,javascript,jquery,dom,prototypejs,Javascript,Jquery,Dom,Prototypejs,我正在从事一个遗留项目(Rails 3.1之前),它已经存在多年了,所以它到处都有Prototype和jQuery,总的想法是在jQuery中重写所有的原型 我正在处理一个自动完成样式下拉列表的问题,它将用一些数据填充DOM中的一个区域。这很好,但此自动完成的某些实例有项目限制。因此,在添加数据时,它将检查某个选择器是否超过N个,并删除最后一个选择器 我这样做的职能是直截了当的: function remove_items(num, selector) { while (select

我正在从事一个遗留项目(Rails 3.1之前),它已经存在多年了,所以它到处都有Prototype和jQuery,总的想法是在jQuery中重写所有的原型

我正在处理一个自动完成样式下拉列表的问题,它将用一些数据填充DOM中的一个区域。这很好,但此自动完成的某些实例有项目限制。因此,在添加数据时,它将检查某个选择器是否超过N个,并删除最后一个选择器

我这样做的职能是直截了当的:

function remove_items(num, selector) {
      while (selector.length >= num) {
          selector[selector.length-1].remove()
      }
  };
我通过jQuery选择的限制和对象数组,我希望有一个限制

问题似乎是选择器中元素的.remove()将使用Prototype方法将其从DOM中删除,即使它是一个jQuery对象。然后,由于选择器数组没有被更改,循环使用prototype方法再次运行,并抛出一个错误,因为现在元素不在DOM中

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


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

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


参考帮助:

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


有用参考:

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

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

请参阅:&/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:

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

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

请参阅:&/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:

如果
选择器
是本机数组,您可以使用以下命令将其截断为
num
项:

selector.splice(num);

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

selector = selector.slice(0, num);

请注意,在后一种情况下,将此代码包装到函数中没有什么意义,如果这样做,则必须
返回新对象,而不是依赖于正在修改的传递参数。

如果
选择器
是本机数组,则可以使用以下命令将其截断为
num
项:

selector.splice(num);

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

selector = selector.slice(0, num);

请注意,在后一种情况下,将此代码包装到函数中没有什么意义,如果这样做,则必须
返回新对象,而不是依赖于正在修改的传递参数。

jQuery.noConflict()
-
jQuery.noConflict()
-这很有意义,但是尝试这种方法我得到:TypeError:Object[Object Object]没有有意义的方法'pop',但是尝试这种方法我得到:TypeError:Object[Object Object]没有方法'pop'
selector.splice(num)
。。。你的意思是
selector.length=num对吗?;-)否则,+1。@Jack不,我明确不是这个意思,因为如果数组长度小于
num
,并且
.splice()
,那么你的方法就有可能增加数组长度(用
未定义的
填充)<代码>selector.length=Math.min(selector.length,num)不再那么短了。。。虽然好处是没有回报价值,但不是这样。。。我已经用我的第一个评论投了赞成票。哈哈,我以为你是说如果我使用了你的(坏的)方法,你会给+1!:)<代码>选择器.拼接(num)
。。。你的意思是
selector.length=num对吗?;-)否则,+1。@Jack不,我明确不是这个意思,因为如果数组长度小于
num
,并且
.splice()
,那么你的方法就有可能增加数组长度(用
未定义的
填充)<代码>selector.length=Math.min(selector.length,num)不再那么短了。。。虽然好处是没有回报价值,但不是这样。。。我已经用我的第一个评论投了赞成票。哈哈,我以为你是说如果我使用了你的(坏的)方法,你会给+1!:)