1

私は何年も前からあるレガシープロジェクト(Rails 3.1より前)に取り組んでいるので、プロトタイプとjQueryがいたるところにあり、すべてのプロトタイプをjQueryで書き直すという一般的なアイデアがあります。

私は、オートコンプリート スタイルのドロップダウンの問題に取り組んでいます。これにより、DOM の領域にデータが入力されます。これは正常に機能しますが、このオートコンプリートの特定のインスタンスにはアイテム制限があります。そのため、データを追加するときに、特定のセレクターが N 個以上存在するかどうかを確認し、最後のセレクターを削除します。

これを行うための私の機能は簡単です:

function remove_items(num, selector) {
      while (selector.length >= num) {
          selector[selector.length-1].remove()
      }
  };

jQuery で選択されたオブジェクトの制限と配列を渡します。制限が必要です。

問題は、セレクターの要素の .remove() が、jQuery オブジェクトであっても、Prototype メソッドを使用して DOM から削除することです。次に、セレクター配列が変更されていないため、prototype メソッドでループが再度実行され、要素が DOM にないため、エラーがスローされます。

ループの前にセレクターの長さのカウント変数を作成し、これを毎回 1 ずつ減らしましたが、明らかにこれは理想的なソリューションとは言えません。

なぜこれが起こっているのか、またはそれを止める方法を知っている人はいますか?

4

3 に答える 3

1

がネイティブ配列の場合は、次を使用して項目にselector切り詰めることができます。num

selector.splice(num);

が jQuery オブジェクトの場合selector、その場で変更しようとするのは悪い習慣です。他の 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 に答える