Подтвердить что ты не робот

Метод 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
4b9b3361

Ответ 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","");