2014-03-25 104 views
3

我實際上是由API調用錯誤的jQuery's .clone()

而不是使用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

我認爲關於jquery.clone的文檔被遺漏,但在庫中應用。這應該像其他低級jQuery一樣工作,如$ .data()。 –

+2

他們在哪裏提到第二種情況不應該起作用? –

+0

@BhushanKawadkar因爲API說.clone()只能接受一個布爾值(或2個布爾值)作爲參數 –

回答

3

它看起來像一個內部方法,而不是暴露給用戶(這可能是爲什麼沒有API文檔)。

的.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); 
    }); 
} 
+0

我對jQuery內部代碼有點陌生......它怎麼看起來像是遞歸的? clone()是一個函數,它接受2個參數,返回'foo.map(fn)',其中'foo'是clone()'方法被調用的對象,'fn'是'jQuery.clone()'本身...?所以這意味着......'bar.clone()'和'jQuery.clone(bar)'是一樣的嗎? –

+2

@動靜能量它們不是遞歸的,因爲它們都是2種不同的方法...... 1是一種插件方法,其他方法是靜態方法..請參閱答案 –

+0

中附加的鏈接,所以你在說'$(「... 「).clone'和'jQuery.clone'是兩個不同的函數,它們運行不同的代碼集合 –

4

根據$ vs $()

到現在爲止,我們已經完全處理在 上調用jQuery對象的方法。

例如:

$("h1").remove();

大多數jQuery方法被稱爲jQuery的對象,如上所示;這些方法被認爲是$.fn命名空間或「jQuery原型」的一部分,並且最好被認爲是jQuery對象方法。

但是,有幾個方法,不作用於選擇;這些方法被認爲是jQuery命名空間的一部分,並且被認爲是核心jQuery方法。

這個區別可能令人難以置信的混淆新的jQuery用戶。 這裏有您需要記住什麼:

  • 方法稱爲jQuery的選擇是在$.fn命名空間,並自動接收和返回的選擇爲this

  • $命名空間中的方法通常是實用程序類型的方法,不適用於選擇;它們不會自動傳遞任何參數,並且它們的返回值會有所不同。

然而,使用調試器通過JSFiddle運行,似乎它甚至從來沒有獲得對$.fn命名空間clone()方法實際上是打$().clone()。這可能是由於$().clone()$.clone()(當jquery文件被加載時運行),如上面鏈接的源代碼Arun P Johny。我希望這是有道理的...我的建議只是通過調試器來查看自己。

相關問題