0

そこで、クローンされたテキストエリアと選択の値を修正するこのjQueryクローンプラグインを入手しました(テキストエリアと選択を含むクローンされた要素の値をコピーします)。

コードは次のようになります

(function (original) {
    jQuery.fn.clone = function () {
    var result           = original.apply(this, arguments),
        my_textareas     = this.find('textarea').add(this.filter('textarea')),
        result_textareas = result.find('textarea').add(result.filter('textarea')),
        my_selects       = this.find('select').add(this.filter('select')),
        result_selects   = result.find('select').add(result.filter('select'));
        //console.log('this',this)
       //console.log('my',this.find('textarea').length,'rsult',this.filter('textarea'),length);

       for (var i = 0, l = my_textareas.length; i < l; ++i)          
            $(result_textareas[i]).val($(my_textareas[i]).val());
       for (var i = 0, l = my_selects.length;   i < l; ++i) 
            result_selects[i].selectedIndex = my_selects[i].selectedIndex;

       return result;
     };
  }) (jQuery.fn.clone);

これは完璧です。ただし、これらの行

my_textareas     = this.find('textarea').add(this.filter('textarea')),
result_textareas = result.find('textarea').add(result.filter('textarea')),    

私が理解していないのは、内部のすべてのテキストエリアを既に選択しているのに、なぜもう一度する必要があるのadd .filter('textarea')ですか(後で値を取得するためにループします)。thisfind

私の見解は

my_textareas     = this.find('textarea'),
result_textareas = result.find('textarea'), 

がなくても問題なく動作するはずadd(filter..)です。

他に何かfilter理由があるのでしょうか?

4

1 に答える 1

2

find子孫要素のみを取得します。 filterトップレベルの要素のみを取得します。

textarea両方を使用することで、コレクション内の要素の子孫である要素だけでなく、コレクション内の要素も取得できます。

例:

<div class="abc">
    <textarea id="one"></textarea>
</div>
<textarea class="abc" id="two"></textarea>

これを行う場合:

$(".abc").find("textarea")

コレクションにはtextarea、id が「two」の のみが含まれます。ただし、次の場合:

$(".abc").filter("textarea")

コレクションにはtextarea、ID が「one」の のみが含まれます。あなたが投稿したコードは、「1」と「2」の両方を取得する両方を使用しています。

于 2013-06-26T19:59:23.750 に答える