2011-09-02 48 views
19

如果你把一個‘數據 - ’屬性的元素:jQuery的駝峯映射「數據()」鍵

<div id='x' data-key='value'> 

然後你就可以用價值jQuery的「數據()」方法:

alert($('#x').data('key')); // alerts "value" 

庫使用屬性名稱一致的駱駝情況下轉換器的嵌入式破折號:

<div id='x' data-hello-world="hi"> 

alert($('#x').data("helloWorld")); 

駱駝 - 案例轉換器是一個jQuery的「全球性」的功能:

alert($.camelCase("hello-world")); // alerts "helloWorld" 

然而這一切都發生故障時的屬性名稱有一個名字與一個單個字母破折號包圍:

<div id='x' data-image-x-offset='50px'> 

alert($('#x').data('imageXOffset')); // undefined 

這是一個有點古怪,因爲:

alert($.camelCase('image-x-offset')); // "imageXOffset" 

那麼,怎麼了?我認爲這與用於執行其他方向的機制有關,將已經駱駝大小寫的名稱轉換回虛線形式。但是我無法在代碼中找到它。

似乎在1.6.2中與1.6.3中一樣。 (形式爲「圖像x偏移量」可以用來獲取數據,順便說一句。)

編輯 —如果對於一個給定的元素,通過虛線形式之前訪問企圖的駱駝 - 它的作品(並告訴我,這絕對是一個bug :-)

+1

jQuery bug報告在這裏:http://bugs.jquery.com/ticket/10194(由@Pointy提交) –

+0

jsFiddle for you:http://jsfiddle.net/hJDLY/1/。整潔,它看起來像OP做錯誤報告!:-P – numbers1311407

+0

謝謝大家!這吃了我的早上:/ – Pointy

回答

14

你是對的。這個問題似乎與他們用於從camelCase轉換爲虛線的正則表達式有關。

rmultiDash = /([a-z])([A-Z])/g; 

... as used here

var name = "data-" + key.replace(rmultiDash, "$1-$2").toLowerCase(); 

...這會導致:

data-image-xoffset 

...而不是:

data-image-x-offset 

演示:http://jsfiddle.net/TLnaW/

因此,當您使用虛線版本時,當它查找屬性時,會發現它不需要轉換,然後將駝峯版本添加到jQuery.cache中的元素數據。

隨後的嘗試將會工作,因爲正確的camelCase現在在那裏,所以它不再試圖將它作爲一個屬性,因此不再需要錯誤的正則表達式。

+1

當我看到它時,我盯着它看,但是當我試圖弄清它到底會做什麼時,我會大聲疾呼 - 謝謝! – Pointy