jquery data () не работает
У меня проблемы с функцией данных jquery.
$ (e.target) .data («unitId») не определен.
Некоторое время я пытался решить эту проблему, но не могу найти, что не так с моим кодом.
Кто-нибудь видит, что здесь не так?
2 ответа
Когда вы запрашиваете .data(«dataId») с помощью camelcase, jQuery превращает его в запрос атрибута «data-data-id» .
Вы можете исправить это, не используя Camelcase. Например, если вы используете строчные буквы для имени атрибута как в HTML, так и в jQuery, все работает нормально. Или вы можете изменить HTML, чтобы использовать «data-data-id» в качестве имени атрибута, и оставить верблюжий регистр в HTML.
Это объяснение взято из документа jQuery:
$( «div» ).data( «lastValue» ) === 43;
Код . выше правильно относится к Атрибут элемента data-last-value . В случае, если данные не сохранены с переданным ключом jQuery ищет среди атрибутов элемент, преобразуя строку в верблюжьем корпусе в пунктирную строку, а затем добавление данных к результату. Итак, строка lastValue преобразуется к data-last-value .
Вместо этого попробуйте:
Всегда старайтесь использовать строчные буквы в разметке и коде, чтобы не столкнуться с такими проблемами.
Например, учитывая следующий HTML:
Весь следующий код jQuery будет работать.
Второй оператор приведенного выше кода правильно относится к Атрибут элемента data-last-value . В случае, если данные не сохранены с переданным ключом jQuery ищет среди атрибутов элемент, преобразование строки в верблюжьем регистре в пунктирную строку, а затем добавление данных к результату . Итак, строка lastValue преобразуется кому: data-last-value .
Источник
jQuery .data () не работает, но .attr () работает
Простите меня за то, что я не уточнил по этому поводу. У меня такой странный баг. После загрузки документа я зацикливаю некоторые элементы, которые изначально были data-itemname=»» , и устанавливаю эти значения, используя .attr(«data-itemname», «someValue») .
Проблема: когда я позже перебираю эти элементы, elem.data().itemname я получаю «» , если да elem.attr(«data-itemname») , то получаю «someValue» . Это похоже на то, что .data() геттер jQuery получает только те элементы, которые изначально заданы как содержащие какое-то значение, но если они изначально пусты, а затем установлены, то .data() не получает значение позже.
Я пытался воссоздать эту ошибку, но не мог.
редактировать
Кроме того, фрагменты из приведенной выше ссылки .
Несколько дней назад я столкнулся с подобной «ошибкой» при работе с атрибутами данных HTML5 .data() и .attr(‘data-name’) для них.
Поведение, которое вы описываете, не является ошибкой, а является преднамеренным.
.data() Вызов является особенным — он не только получить HTML5 атрибуты данных также попытки оценить / синтаксический анализ атрибутов. Таким образом, с таким атрибутом, как data-myjson=’<"hello":"world">‘ при извлечении через, .data() будет возвращена строка, Object а при извлечении через .attr() . См. Пример jsfiddle.
Поскольку .data() дополнительная обработка, jQuery сохраняет результаты оценки атрибутов $.cache — в конце концов, после того, как атрибут данных был оценен, было бы бесполезно переоценивать при каждом .data() вызове — тем более, что переменные данных могут содержать сложные строки JSON.
Я сказал все это, чтобы сказать следующее: после получения атрибута с помощью .data() любых изменений, сделанных с помощью .attr(‘data-myvar’, ») , не будут видны последующие .data() вызовы. Проверьте это на jsfiddle.
Чтобы избежать этой проблемы , не смешивайте .data и .attr() звонки. Используйте то или другое.
Источник
jQuery .data () не работает, но .attr () работает
Простите меня за то, что я не стал более конкретным по этому поводу. У меня такой странный баг. После загрузки документа я зацикливаю некоторые элементы, которые изначально имеют data-itemname=»» , и устанавливаю эти значения с помощью .attr(«data-itemname», «someValue») .
Проблема: когда я позже перебираю эти элементы, если я выполняю elem.data().itemname , я получаю «» , но если я выполняю elem.attr(«data-itemname») , я получаю «someValue» . Это похоже на то, что геттер jQuery .data() получает только те элементы, для которых изначально задано некоторое значение, но если они изначально пусты, а затем установлены, то .data() не получит значение позже.
Я пытался воссоздать эту ошибку, но не смог.
Изменить
Кроме того, фрагменты из приведенной выше ссылки .
6 ответов
Несколько дней назад я столкнулся с подобной «ошибкой» при работе с .data() и .attr(‘data-name’) для атрибутов данных HTML5.
Поведение, которое вы описываете, не является ошибкой, а является преднамеренным.
Вызов .data() особенный — он не только извлекает атрибуты данных HTML5, но также пытается оценить / проанализировать атрибуты. Таким образом, с таким атрибутом, как data-myjson=’<"hello":"world">‘ , при извлечении через .data() вернет Object , а при извлечении через .attr() будет возвращена строка. См. пример jsfiddle.
Поскольку .data() выполняет дополнительную обработку, jQuery сохраняет результаты оценки атрибута в $.cache — в конце концов, после того, как атрибут данных был оценен, было бы бесполезно повторять оценку при каждом вызове .data() — тем более, что переменные данных могут содержать сложные строки JSON.
Я сказал все это, чтобы сказать следующее: После получения атрибута через .data() любые изменения, внесенные .attr(‘data-myvar’, ») , не будут видны при последующих вызовах .data() . Протестируйте это на jsfiddle.
Чтобы избежать этой проблемы, не смешивайте вызовы .data и .attr() . Используйте один или другой.
Вы должны установить данные с помощью .data(‘itemname’, ‘someValue’); . Использование .attr() для установки атрибутов данных не сработает: http://jsfiddle.net/ThiefMaster/YHsKx /
Однако вы можете предоставить встроенные значения, используя, например,
Почему бы тебе просто не использовать .data() везде?
Вы также можете объявить значения по умолчанию встроенными в HTML, что тоже нормально.
Если вы хотите это изменить, просто сделайте
И чтобы полностью удалить его, вы можете вызвать
Вам действительно стоит постараться и избегать использования .attr(«data-*») , я не знаю, почему вы все равно захотите это сделать.
Это потому, что имя атрибута data-itemname . Вы не можете использовать — в сокращенной записи obj.attribute (obj.data-itemname будет интерпретироваться как «obj.data minus itemname»).
.attr(«data-itemname», «someValue») изменяет DOM.
.data(«itemname», «someValue») изменяет кеш jQuery.
Чтобы это работало в следующем Javascript и в дополнение к CSS, вы должны установить оба.
Это результат недопонимания: data НЕ является средством доступа для data-* атрибуты . И больше, и меньше.
data — это средство доступа к кешу данных jQuery на элементе. Этот кеш инициализируется из атрибутов data-* , если они есть, но data никогда не записывает в атрибуты, и изменение атрибута не меняет кеш данных после инициализации:
data также массирует то, что находит, различными способами, угадывая типы данных, создавая data(«answer») для элемента с data-answer=»42″ числом, а не строкой, или даже анализируя вещи как JSON, если они выглядят как JSON:
Если вы хотите использовать атрибуты (как для чтения, так и для их установки), используйте attr , не data . attr — метод доступа к атрибутам.
Источник