removeData() метод jQuery не работает

Я думаю, что я использую removeData правильно, но он, похоже, не работает, вот что я вижу в консоли разработчика, может ли кто-нибудь объяснить, что я делаю неправильно?

Я выводю текущее значение атрибута данных, вызывая removeData, затем снова выводя значение и его все еще там.

$('.questionList > li').eq(1).data('fieldlength')
3
$('.questionList > li').eq(1).removeData('fieldlength');
[
<li class=​"questionBox" data-createproblem=​"false" data-fieldlength=​"3" data-picklistvalues data-required=​"true" data-sfid=​"a04d000000ZBaM3AAL" data-type=​"Text">​
<div class=​"questionLabel">​Birthdate​</div>​
</li>​
]
$('.questionList > li').eq(1).data('fieldlength')
3

5 ответов


это потому, что ваш data происходит из HTML . Согласно документы:

при использовании .removeData ("имя"), jQuery попытается найти данные- атрибут элемента, если в элементе нет свойства с таким именем внутренний кэш данных. Чтобы избежать повторного запроса атрибута data, установите имя значения null или undefined (например .данные("имя", undefined)) вместо использования .removeData().

так вместо

$('.questionList > li').eq(1).removeData('fieldlength');

вы должны сделать

$('.questionList > li').eq(1).data('fieldlength',null);

есть немного gotcha, который я хотел уточнить, если кто-то еще наткнется на него...

если у вас есть HTML5 data-* атрибуты элемента, который вам нужно использовать jQuery removeAttr() вместо removeData() Если вы хотите удалить их из элемента в DOM.

например, чтобы удалить атрибут данных из элемента, необходимо использовать:

$({selector}).removeAttr('data-fieldlength');

вы можете читать значения с $({selector}).data('fieldlength') но removeData() фактически не удаляет их, если они являются атрибутами HTML для элемента, присутствующего в источнике страницы (он просто удаляет его в памяти, так что если вы снова запросите его с помощью jQuery it появляется для удаления).

лично я думаю, что это поведение нарушено, и я уверен, что ловит много людей.


в скрытом поле, используя пользовательский атрибут данных для хранения данных объекта Должны использовать. removeAttr() вместо .removeData () с помощью ID


на самом деле это работает лучше для меня. Потому что он оставляет атрибут нетронутым в элементе, но без присвоенного ему значения.

$(selector).attr("data-fieldlength","");

.removeData() будет только удалить данные из внутреннего jQuery .data() кэш нужно data- атрибуты элемента не будут удалены. Последний вызов data() поэтому повторно извлекает значение из элемента . Чтобы предотвратить это, используйте .removeAttr() вместе с .removeData() удалить data- атрибут, а также.

пример:

$('div').removeData('info');
$('div').removeAttr('data-info');

затем установите либо:

$('div').data('info', 222);
$('div').attr('data-info', 222);