jQuery игнорирует регистр в именах атрибутов / данных? - PullRequest
13 голосов
/ 04 октября 2011

Мы используем атрибуты data-* в HTML5 для некоторых настроек взаимодействия с клиентом. jQuery использует их, чтобы делать свое дело.

Суть в том, что входящий HTML может отличаться. Очевидно, что это проблема, которая должна быть исправлена, но я не всегда контролирую создаваемый HTML, к сожалению.

Вопрос:

Учитывая эти два тега:

<a data-sampleAttributeName="example">

<a data-sampleattributename="example">

Есть ли умный способ обращаться с ними как с одним и тем же?

Лучшее, что я придумал, примерно так:

var theAttribute = ($myobject).data('sampleAttributeName');

if (($myobject).data('sampleAttributeName')){
    theAttribute = ($myobject).data('sampleAttributeName')
} else {
    theAttribute = ($myobject).data('sampleattributename')
}

Я мог бы превратить это в функцию, в которую я мог бы просто передать версию camelCase и проверить обе. Мне было просто интересно, есть ли в jQuery более понятная встроенная функция, которая игнорирует регистр значения data (или attr).

Ответы [ 3 ]

28 голосов
/ 04 октября 2011

Для обоих приведенных здесь вариантов вы должны получить значение, используя

.data('sampleattributename')

Верблюжий кожух (.data('sampleAttributeName')) предназначен для случаев, когда атрибут имеет следующий вид:

<a  data-sample-attribute-name="something">Anchor</a>

Проверьте этот jsfiddle

2 голосов
/ 04 октября 2011

Для каждого интересующего вас элемента переберите объект, возвращаемый .data (), и обновите данные jQuery этого элемента с помощью toLowerCase () - используя ключи.

$('a').each(function ()
{
    var $this = $(this),
        data = $this.data(),
        kTemp;

    for (var k in data)
    {
        kTemp = k.toLowerCase();
        if (k !== kTemp)
        {
            $this.data(kTemp, data[k]).removeData(k);
        }
    }
});
0 голосов
/ 15 августа 2012

У меня есть много устаревшего кода, который имеет атрибуты данных в HTML.Некоторые атрибуты содержат тире, а некоторые имеют смешанный регистр.Для поддержки спецификации w3c для атрибутов данных html5 и изменений в $ .data, представленных в jQuery 1.6, я сделал функцию для преобразования строк имен атрибутов данных в их эквивалент w3c;Это означает, что такие атрибуты, как «data-fooBar», будут преобразованы в «foobar», а «data-foo-barBaz» будут преобразованы в «fooBarbaz».Мне нужно было что-то вроде этого, чтобы добавить к моим вызывающим $ .data (), чтобы мне не пришлось обновлять существующий HTML, который может включать обновления базы данных, и было бы кошмаром, чтобы найти все атрибуты данных и обновить их досоответствовать спецификации w3c.Эта функция разработана специально для использования в библиотеке jquery и проверяет версию jquery, заменяя только тире (+ camelcase) для версии 1.6+ jQuery (все атрибуты данных будут преобразованы в нижний регистр независимо от версии jQuery).Функция может быть легко преобразована для работы без jQuery.

Использование:

var html5data = $(this).data(w3cdatakey('foo-barBaz')); //same as $.data('fooBarbaz');

проверить эту скрипку: пример jsfiddle

...