0

所以我得到了这个 jQuery 克隆插件,它修复了克隆的 textarea 和 select 的值(复制克隆元素的值,包括 textarea 和 selects)。

代码是这样的

(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')当我们已经选择了里面this的所有 textarea 时,为什么我们需要再次这样做find(我们循环通过它稍后获取值)。

我的看法是

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")

我们的集合将只包含textareaid 为“two”的。但是,如果我们这样做:

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

我们的集合将仅包含textareaid 为“one”的。您发布的代码同时使用“一”和“二”。

于 2013-06-26T19:59:23.750 回答