【问题标题】:jQuery and Prototype methods interfering with each otherjQuery 和 Prototype 方法相互干扰
【发布时间】:2013-05-10 03:13:13
【问题描述】:

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

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

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

【问题讨论】:

标签: javascript jquery dom prototypejs


【解决方案1】:

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

selector.splice(num);

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

selector = selector.slice(0, num);

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

【讨论】:

  • selector.splice(num) ...您的意思是selector.length = num; 对吗? ;-) 否则,+1。
  • @Jack 不,我不是那个意思,因为你的方法有可能增加数组长度(用undefined填充)如果它比@短987654330@,而.splice() 没有。
  • 好点,我没有考虑过 ;-) selector.length = Math.min(selector.length, num); 不再那么短了......虽然好处是没有返回值。
  • 不是这样......我已经在我的第一条评论中投了赞成票,哈哈。
  • 啊,我以为你是说如果我使用了你的(坏掉的)方法,你给+1! :)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这根本与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/

    【讨论】:

    • 有道理,但尝试这种方法我得到:TypeError: Object [object Object] has no method 'pop'
    猜你喜欢
    • 2013-04-27
    • 2023-01-31
    • 2019-03-23
    • 2011-07-14
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多