我实际上在对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表明它不应该适用于第二种情况。我想知道为什么两种情况都有效?
答案 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()方法在内部使用它,因此两者都是相同的
clone: function( dataAndEvents, deepDataAndEvents ) {
dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
return this.map( function () {
return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
});
}