2014-11-27 2 views
2

Если data-x находится в DOM, как это:Данные jQuery (...) не хранятся в DOM?

<div id="blah" data-x="143">Hello</div> 

и я могу изменить его с

$('#blah').data('x', 13687) 

то, кажется, что data-x не изменяется в DOM (Осмотреть особенность использования браузера на сниппета код ниже):

enter image description here

Это нормальное поведение?


Пример:

console.log($('#blah').data('x')); 
 
$('#blah').data('x', 13687) 
 
console.log($('#blah').data('x'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
 
<div id="blah" data-x="143">Hello</div>

+0

Вы уверены, что вы не загружаете '

Hello
' с помощью ajax или javascript. Иначе вы можете попробовать '$ ('body'). Find ('# blah').data ('x', 13687) ' –

+0

Да, он не хранится в DOM, а скорее в промежуточном хранилище (' $ .cache'). Изменения свойств данных, выполненные с помощью метода 'data()', не влияют на атрибуты. – dfsq

+0

вам нужно использовать $ ('# blah'). Attr ('data-x', '16387') – Riad

ответ

8

data() метод JQuery в не набор атрибутов данных, он сохраняет данные во внутреннем объекте.
Атрибуты данных HTML5 будут автоматически привязаны к объекту данных jQuery, что означает, что начальное значение объекта данных отражает все, что указано в атрибуте, но изменение значения с помощью data()не будет обновить атрибут, только внутренние данные объект, который использует jQuery.

Так что да, это нормально, что атрибут не меняется, и он должен быть таким.

Если по какой-то причине вы должны изменить фактический атрибут, вы можете использовать attr()

$('#blah').attr('data-x', 13687) 

Обратите внимание, что это, как правило, не требуется, если вы постоянно используете data() в вашем коде, и вы не используете другие скрипты, которые полагаются на атрибут data.

Вы найдете больше о том, как атрибуты обрабатываются, и как JQuery хранит данные в docs

+0

Спасибо! Если в конце сеанса (с изменениями в data-x) нам необходимо ** сериализовать ** DOM (включая значения 'data-x'), вы бы сделали это: 1) LOOP для каждого элемента , 2) Do '$ ('# blah'). Attr ('data-x', $ ('# blah'). Data ('x'))' для сохранения данных-x в DOM, 3) Сериализация DOM ... Ты бы сделал это или что-то еще @adeneo? – Basj

+0

@Basj - Я, вероятно, вообще не сериализую DOM, я думаю, что я сделал это только один раз в проекте, и это обычно не обязательно, вместо этого я создавал бы пользовательские объекты, содержащие значения, имя элемента, id, данные и т. д., и при необходимости эти объекты могут быть преобразованы в JSON и т. д. – adeneo

+0

Ok @adeneo. Предположим, нам нужно экспортировать HTML-файл (с изменением данных-x во время просмотра) с новыми значениями data-x. Сделаете ли вы шаг 1) 2) 3), описанный в моем последнем комментарии, или что-то еще? – Basj

0
console.log($('#blah').attr('data-x')); 
$('#blah').attr('data-x', 13687); 
console.log($('#blah').attr('data-x')); 

Используйте функцию attr() для обработки атрибутов и их данные.

ОБНОВЛЕНИЕ: Я пишу небольшой плагин для вас!

$.fn.dataRead=function(a,b){ 
    this.attr("data-"+a,b); 
}; 

Теперь работа, как вам нужно: пример:

console.log($('#blah').dataRead('x')); 
    $('#blah').dataRead('x', 13687); 
    console.log($('#blah').dataRead('x')); 
+0

Замена встроенной * 'data' функции * очень плохая идея *. Это потенциально нарушит другие плагины, которые хранят объекты в данных. –

+0

@TrueBlueAussie. Кроме того, jQuery использует 'data' внутри для определенных встроенных методов для хранения произвольных данных, которые могут быть нарушены при замене метода, так что это действительно ** плохая идея. – adeneo

+0

Хорошо, я просто редактирую это и меняю имя функции. Вы правы в замене функций. –

1

вы должны использовать $('#blah').attr('data-x', 13687) не $('#blah').data('x', 13687), потому что data() не метод, чтобы получить атрибут данных-х, чтобы установить у вас есть использовать attr() для установки значения.

Смежные вопросы