Простите меня за то, что я не уточнил по этому поводу. У меня такой странный баг. После загрузки документа я зацикливаю некоторые элементы, которые изначально были data-itemname=""
, и устанавливаю эти значения, используя .attr("data-itemname", "someValue")
.
Проблема: когда я позже перебираю эти элементы, elem.data().itemname
я получаю ""
, если да elem.attr("data-itemname")
, то получаю "someValue"
. Это похоже на то, что .data()
геттер jQuery получает только те элементы, которые изначально заданы как содержащие какое-то значение, но если они изначально пусты, а затем установлены, то .data()
не получает значение позже.
Я пытался воссоздать эту ошибку, но не мог.
редактировать
Я воссоздал ошибку! http://jsbin.com/ihuhep/edit#javascript,html,live
Кроме того, фрагменты из приведенной выше ссылки ...
JS:
var theaters = [
{ name: "theater A", theaterId: 5 },
{ name: "theater B", theaterId: 17 }
];
$("#theaters").html(
$("#theaterTmpl").render(theaters)
);
// DOES NOT WORK - .data("name", "val") does NOT set the val
var theaterA = $("[data-theaterid='5']");
theaterA.find(".someLink").data("tofilllater", "theater5link"); // this does NOT set data-tofilllater
$(".someLink[data-tofilllater='theater5link']").html("changed link text"); // never gets changed
// WORKS - .attr("data-name", "val") DOES set val
var theaterB = $("[data-theaterid='17']");
theaterB.find(".someLink").attr("data-tofilllater", "theater17link"); // this does set data-tofilllater
$(".someLink[data-tofilllater='theater17link']").html("changed link text");
HTML:
<body>
<div id="theaters"></div>
</body>
<script id="theaterTmpl" type="text/x-jquery-tmpl">
<div class="theater" data-theaterid="{{=theaterId}}">
<h2>{{=name}}</h2>
<a href="#" class="someLink" data-tofilllater="">need to change this text</a>
</div>
</script>
elem.data("itemname")
неelem.data().itemname
?elem.data().itemname = somevalue;
, основные данные не меняются.)Ответы:
Несколько дней назад я столкнулся с подобной «ошибкой» при работе с атрибутами данных 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()
звонки. Используйте то или другое.источник
Это результат недоразумения:
data
НЕ является средством доступа кdata-*
атрибутам . И больше, и меньше.data
- это средство доступа к кешу данных jQuery для элемента. Этот кеш инициализируется изdata-*
атрибутов, если они есть, ноdata
никогда не записывает в атрибуты, равно как и изменение атрибута не изменяет кеш данных после инициализации:data
также массирует то, что находит, различными способами, угадывая типы данных, создаваяdata("answer")
элемент сdata-answer="42"
числом, а не строкой, или даже анализируя вещи как JSON, если они выглядят как JSON:Если вы хотите использовать атрибуты (как для чтения, так и для их установки), используйте
attr
, notdata
.attr
- аксессуар для атрибутов.источник
Это потому, что имя атрибута
data-itemname
. Вы не можете использовать-
сокращеннуюobj.attribute
запись (obj.data-itemname будет интерпретироваться как «obj.data minus itemname»).источник
.attr("data-itemname", "someValue")
изменяет DOM..data("itemname", "someValue")
изменяет кеш jQuery.Чтобы это работало в следующем Javascript и в дополнение к CSS, вы должны установить оба.
источник
Почему бы тебе просто не использовать
.data()
везде?Вы также можете объявить значения по умолчанию встроенными в HTML, что тоже нормально.
и
если ты хочешь это изменить, ты просто делаешь
и чтобы полностью удалить его, вы можете вызвать
вам действительно стоит стараться избегать использования
.attr("data-*")
, я все равно не знаю, зачем вам это нужно.источник
.attr('data-*', ...)
не сделает данные видимыми для.data()
getAttribute()
иsetAttribute()
- значит, оба метода получат доступ к фактическим атрибутам, и он снова будет работать. Или вы бы просто использовалиdataSet
свойство, которое предоставляют современные браузеры.class
вместо этого, поскольку в браузерах есть собственные функции для получения элементов с определенным классом.Вы должны установить данные с помощью
.data('itemname', 'someValue');
. Использование.attr()
для установки атрибутов данных не сработает: http://jsfiddle.net/ThiefMaster/YHsKx/Однако вы можете указать встроенные значения, используя, например,
<div data-key="value">
в разметке.источник
.data()
вызов устанавливает атрибут, в то время как.attr()
вызов не делает ничего..attr()
, только.data()
, и длина селектора$(".someLink[data-tofilllater='theater5link']")
равна нулю. так что я должен использовать.attr()
: /Я вижу, что это вызвало некоторые разногласия в отношении подхода к настройке атрибутов данных.
Я тоже столкнулся с этой проблемой и обнаружил, что проблема, по-видимому, связана просто с форматированием имени атрибута данных .
По моему опыту, вам следует избегать использования дефисов в переменной данных (имя переменной, которое следует после « data- »).
У меня это не сработало:
[Разметка]
[jQuery]
Но следующее работало отлично! :):
(При необходимости я использую подчеркивание вместо дефиса)
[Разметка]
[jQuery]
Я надеюсь, что это помогает. Всем привет!
источник