在jQuery中,为什么$ .clone(this)与$(this).clone()相同?

时间:2014-03-25 07:09:33

标签: jquery

我实际上在对jQuery's .clone()的API调用中犯了一个错误:

而不是使用http://jsfiddle.net/AXsB5/17/(您需要点击小提琴才能执行.clone()):

$(".foo").click(function() {
    var el = $(this).clone();

    el.css({ color: "orange" });
    $("#bar").append(el);
});

我错误地使用了http://jsfiddle.net/AXsB5/18/

$(".foo").click(function() {
    var el = $.clone(this);

    $(el).css({ color: "orange" });
    $("#bar").append(el);
});

jQuery API docs表明它不应该适用于第二种情况。我想知道为什么两种情况都有效?

2 个答案:

答案 0 :(得分:4)

根据$ vs $()

  

到目前为止,我们一直在处理被调用的方法   一个jQuery对象。

     

例如:

     

$( "h1" ).remove();

     

大多数jQuery方法都是在jQuery对象上调用的,如上所示;据说这些方法是$.fn命名空间或" jQuery原型的一部分,"并且最好被认为是jQuery对象方法。

     

但是,有几种方法不会对选择起作用;据说这些方法是jQuery命名空间的一部分,最好被认为是核心jQuery方法。

     

这种区别对于新的jQuery用户来说非常困惑。   以下是您需要记住的内容:

     
      
  • 调用jQuery选择的方法位于$.fn命名空间中,并自动接收并将选择返回为this

  •   
  • $ namespace中的方法通常是实用程序类型的方法,不适用于选择;它们不会自动传递任何参数,它们的返回值也会有所不同。

  •   

但是,使用调试程序运行JSFiddle,似乎它甚至从未到达clone()命名空间上的$.fn方法,实际上正在点击{{1 }}。这可能是由于它$().clone()内部$().clone()映射(在加载jquery文件时运行),如上面由 Arun P Johny 链接的源代码中所示。我希望这是有道理的...我的建议只是通过一个调试器来完成自己的工作。

答案 1 :(得分:3)

它看起来像一个内部方法,没有向用户公开(可能是为什么没有api doc)。

.clone()方法在内部使用它,因此两者都是相同的

jQuery.clone().clone()

clone: function( dataAndEvents, deepDataAndEvents ) {
    dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
    deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;

    return this.map( function () {
        return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
    });
}