2011-05-05 24 views
8

如果你刪除了某些應該使用removeAttr的東西,它會靜默失敗嗎?它會起作用嗎?它會實際刪除整個屬性還是隻刪除其中的值?JQuery 1.6中的removeProp和removeAttr有什麼區別?

如果使用prop()添加了'checked',是否可以使用removeAttr來刪除它?

很多問題!

+3

難道這些不是那種的問題,你可以通過編寫5-10線的jQuery和觀察結果回答自己呢? – 2011-05-05 07:44:35

回答

4

元素的屬性與'class'類似。而它的財產將是'className'。

這是將jQuery.prop和jQuery.propHooks添加到版本1.6中的原因,以便更輕鬆地使用它們。

因此,如果該屬性具有與該屬性相同的名稱,則可以同時使用removeProp或removeAttr。

我問jQuery的論壇,類似的問題,得到了這樣的回答:

是,attr爲意味着HTML屬性 因爲他們嚴格定義。道具爲 屬性。因此,舉個例子,說 你有一個節點元素 「東西」(原始元素不是jQuery 對象)。 elem.className是 屬性,但屬於 屬性。更改類 屬性也會自動更改屬性 ,反之亦然。 目前,attr是混亂和 混淆,因爲它已經嘗試了 作業的兩個功能,並有 許多錯誤,因爲這一點。該 引進jQuery.fn.prop將 解決幾個攔截,單獨的代碼 因爲它應該已經從 開始分離,並給開發商 更快的功能做他們 希望他們做什麼。讓我補足一秒 的百分比,並說從我的經驗 支持IRC和 讀取其他的代碼,95%的使用 情況下attr將不必切換 爲prop。

編輯

這可能是最好堅持使用或者jQuery.attr或jQuery.prop。在使用兩者設置和刪除checked屬性時,這些似乎是一些奇怪的行爲。

在這裏看到一個例子:http://jsfiddle.net/tomgrohl/uTCJF/

有1.6的錯誤做選擇:http://bugs.jquery.com/ticket/9079

7

official jQuery blog提供了一個非常明確的解釋:

在1.6版本中,我們將DOM屬性的處理和DOM 屬性拆分爲不同的方法。新的.prop()方法在DOM元素上設置或獲取 屬性,並且 .removeProp()將刪除屬性。在過去的 中,jQuery並未畫出明確的 屬性和 屬性之間的界限。通常,DOM屬性 表示從文檔檢索到的DOM信息 的狀態,例如 作爲標記 中的值屬性。 DOM 屬性代表文檔的動態狀態 ;例如,如果 用戶在 以上的輸入元素中點擊並且類型def .prop("value")是 abcdef,但是.attr("value")仍然是 abc。

在大多數情況下,瀏覽器將在 屬性值作爲該屬性的初始值 ,但布爾 屬性,如檢查或禁用 有不尋常的語義。

例如,考慮標記 <input type="checkbox" checked>。 檢查屬性 的存在意味着DOM .checked屬性 屬實,即使屬性 沒有值。在上面的代碼 中,檢查的屬性值是 空字符串(或undefined如果沒有指定 屬性),但 檢查的屬性值是true

的jQuery 1.6之前,.attr("checked") 返回的Boolean屬性值, (true),但在jQuery 1.6返回 屬性(一個 空字符串),不改變 的實際值,當用戶點擊複選框爲 改變其狀態。

檢查複選框的當前檢查狀態 有幾種選擇。最佳和最具 性能的是直接使用DOM屬性 ,如事件處理程序中的this.checked內部,此時引用了單擊的 元素。在 使用jQuery 1.6或更新版本的代碼中,新的 方法$(this).prop("checked") 檢索與 this.checked相同的值,並且速度相對較快。 最後,表達式 $(this).is(":checked")適用於所有版本的jQuery的 版本。

+0

呵呵我剛剛讀到這個。這解釋了這裏的奇怪行爲:http:// jsfiddle。淨/ tomgrohl/uTCJF / – Tomgrohl 2011-05-05 08:37:23

0

使用jQuery 1.6,我試圖克隆它有幾個id屬性的菜單項,所以我這樣做:

$('ul.menu').clone().filter('*').removeProp('id').appendTo('.sidebar');

當我在Firebug檢查的元素我有一個很多id="undefined" - 不是我想要的。所以現在我使用removeAttr,它似乎工作得更好。

$('ul.menu').clone().filter('*').removeAttr('id').appendTo('.sidebar');