Отображение jQuery camel-case из имен атрибутов "data-" клавишам ".data()"
Если вы поместите атрибут "data-" для элемента:
<div id='x' data-key='value'>
то вы можете получить значение с помощью метода jQuery ".data()":
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. (Например, форма "image-x-offset" может использоваться для получения данных.)
edit — если для данного элемента вы получаете доступ через пунктирную форму до, используя форму верблюда, то она работает (и это говорит мне, что это определенно bug: -)
Ответы
Ответ 1
Ты прав. Проблема, похоже, связана с регулярным выражением, которое они используют для преобразования из camelCase в пунктир.
rmultiDash = /([a-z])([A-Z])/g;
... как используется здесь:
var name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase();
..., что приводит к:
data-image-xoffset
... вместо:
data-image-x-offset
Демо: http://jsfiddle.net/TLnaW/
Итак, когда вы используете пунктирную версию, когда она ищет атрибут, она находит ее без необходимости преобразования, а затем добавляет версию camelCase в данные элементов в jQuery.cache
.
Последующие попытки затем будут работать, потому что теперь есть правильный camelCase, поэтому он больше не пытается получить его как атрибут и поэтому больше не нуждается в неисправном регулярном выражении.