Иметь jQuery игнорировать регистр в именах атрибутов/данных?
Мы используем атрибуты HTML5 data-*
для некоторых наших взаимодействий на стороне клиента. 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
).
Ответы
Ответ 1
Для обоих приведенных здесь вариантов вы должны получить значение, используя
.data('sampleattributename')
Корпус верблюда (.data('sampleAttributeName')
) предназначен, когда атрибут выглядит следующим образом:
<a data-sample-attribute-name="something">Anchor</a>
Проверьте этот jsfiddle
Ответ 2
Для каждого интересующего вас элемента, итерации по объекту, возвращаемому .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);
}
}
});
Ответ 3
У меня есть много устаревшего кода, который имеет атрибуты данных в html. Некоторые атрибуты содержат тире, а некоторые - смешанные. Чтобы поддерживать спецификацию w3c для атрибутов данных html5 и изменения в .data, появившиеся в jQuery 1.6, я создал функцию преобразования строк имени атрибута данных в их эквивалент w3c; Это означает, что такие атрибуты, как "data-fooBar", будут преобразованы в "foobar", а "data-foo-barBaz" будет преобразован в "fooBarbaz". Мне нужно было что-то подобное, чтобы добавить к моим $.data() вызывающим, поэтому мне не нужно обновлять существующий html, который может включать обновления баз, и было бы кошмаром найти все атрибуты данных и обновить их до соответствуют спецификации w3c. Эта функция разработана специально для использования в jquery-библиотеке и проверяет версию jquery, заменяя только тире (+ camelcase) для jQuery версии 1.6+ (все атрибуты данных будут преобразованы в нижний регистр, независимо от версии jQuery). Функция может быть легко преобразована в работу без jQuery.
Использование:
var html5data = $(this).data(w3cdatakey('foo-barBaz')); //same as $.data('fooBarbaz');
ознакомьтесь с этой скриптой:
Пример jsfiddle