Отображение 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, поэтому он больше не пытается получить его как атрибут и поэтому больше не нуждается в неисправном регулярном выражении.