Метод removeData() jquery не работает
Я думаю, что я правильно использую removeData, но он, похоже, не работает, вот что я вижу в консоли dev, может ли кто-нибудь объяснить, что я делаю неправильно?
Я выводя текущее значение атрибута данных, вызывая 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
Ответы
Ответ 1
Это потому, что ваш data
происходит из атрибута HTML data-fieldlength
. Согласно документам:
При использовании .removeData( "name" ), jQuery попытается найти данные, атрибут для элемента, если свойство с таким именем не находится в внутренний кеш данных. Чтобы избежать повторного запроса атрибута data, установите имя для значения либо null, либо undefined (например,.data( "name", undefined)) вместо использования .removeData().
Итак, вместо
$('.questionList > li').eq(1).removeData('fieldlength');
вы должны сделать
$('.questionList > li').eq(1).data('fieldlength',null);
Ответ 2
Есть бит gotcha, который я хотел уточнить, если кто-нибудь еще наткнется на него...
Если у вас есть атрибуты HTML5 data-*
для элемента, вам нужно использовать jQuery removeAttr()
вместо removeData()
, если вы хотите удалить их из элемента в DOM.
Например, чтобы фактически удалить атрибут данных из элемента, который вам нужно использовать:
$({selector}).removeAttr('data-fieldlength');
Вы можете читать такие значения с помощью $({selector}).data('fieldlength')
, но removeData()
фактически не удаляет их, если они являются атрибутами HTML для элемента, присутствующего в источнике страницы (он просто удаляет его в памяти, так что если вы запросите его снова с помощью jQuery, похоже, он был удален).
Лично я считаю, что это поведение нарушено, и я уверен, что улавливает много людей.
Ответ 3
В скрытом поле с использованием атрибута пользовательских данных для хранения данных объекта
Должен использовать .removeAttr() вместо .removeData(), используя ID
Ответ 4
На самом деле это работает лучше для меня. Потому что он оставляет атрибут неповрежденным в элементе, но без назначенного ему значения.
$(selector).attr("data-fieldlength","");