2013-05-17 8 views
20

Myślę, że używam removeData poprawnie, ale wygląda na to, że nie działa. Oto, co widzę w konsoli dev, czy ktoś może wyjaśnić, co robię źle?Metoda jQuery removeData nie działa

Wywołuję bieżącą wartość atrybutu danych, wywołując metodę removeData, a następnie wyprowadzając ponownie wartość i jej tam nadal.

$('.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

Użycie jest. 'JQuery.removeData ($ ('questionList> li') równ (1) "fieldlength") ' – karthikr

+2

@karthikr Istnieją dwie metody: http://api.jquery.com/removeData/ i http://api.jquery.com/jquery.removeData/ – Blazemonger

Odpowiedz

24

To dlatego twoje data pochodzi z HTML atrybutu data-fieldlength. Według the docs:

Podczas korzystania .removeData („nazwa”), jQuery będzie próbował zlokalizować teleinformatyczny atrybut elementu jeśli ma właściwości o tej nazwie znajduje się w wewnętrznej pamięci podręcznej danych . Aby uniknąć ponownego zapytania do atrybutu data, należy ustawić wartość na wartość null lub undefined (na przykład .data ("name", undefined)) zamiast używać .removeData().

Więc zamiast

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

należy zrobić

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

Dzięki! To działa, chociaż wciąż jestem trochę nieostrożny dokładnie o tym, co się dzieje, nawet po przeczytaniu wyjaśnienia w dokumentach. – turbo2oh

+2

Jak rozumiem: metoda '.data()' sprawdza wartość JavaScript dla wartości, a jeśli nie może jej znaleźć, zamiast tego sluruje w atrybucie 'data-'. Usunąłeś wewnętrzną wartość JavaScript, więc przeszedł on do atrybutu 'data-', tak jak zaprojektowano. Jeśli zamiast tego ustawisz wartość JavaScript na 'null', pobierze to szczęśliwie i zignoruje atrybut' data-'. – Blazemonger

+1

Kiedyś myślałem, że atrybuty 'data -' zostały sparowane tylko raz, kiedy strona została załadowana po raz pierwszy - a gdyby tak było, twój kod działałby dobrze. W rzeczywistości [the docs] (http://api.jquery.com/removeData/) sugerują, że podejście * było * używane przed wersją jQuery 1.4.3 – Blazemonger

28

Jest trochę Gotcha chciałem wyjaśnić, w przypadku, ktoś inny natyka się na niego ...

Jeśli masz atrybuty HTML5 data-* na elemencie, który wymaga użycia jQuery: removeAttr() zamiast removeData(), jeśli chcesz usunąć je z elementu w DOM.

Na przykład, aby rzeczywiście usunąć atrybut danych z elementu trzeba użyć:

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

Można czytać wartości jak ten z $({selector}).data('fieldlength') ale removeData() nie usuwa ich, czy są one HTML atrybuty na elemencie znajdującym się w źródle strony (po prostu usuwa je w pamięci, tak, że jeśli ponownie zapytasz o to za pomocą jQuery, pojawia się , aby je usunąć).

Osobiście uważam, że to zachowanie jest zepsute i jestem pewien, że wyłapie wielu ludzi.

+0

Myślę, że byłoby lepiej, z perspektywy kodowania, zachować atrybut 'data-' w DOM, ale ustaw zmienną JavaScript '.data()' na 'null'. Daje to pożądany wynik w jQuery bez niepotrzebnego niszczenia atrybutu DOM; zawsze istnieje możliwość, że zostanie on użyty w innym miejscu (na przykład style CSS mogą na nim polegać). – Blazemonger

+1

@Blazemonger, jako notatkę, próbowałem zmienić 'data-remote' z true na false, a użycie' .data() 'lub' .removeData() 'nie zadziałało,' .removeAttr() ' działało dobrze. Tak więc dla tych, którzy nie dbają o atrybut DOM, ta metoda działa świetnie. – rmagnum2002

2

W ukrytym polem użyciu danych niestandardowych atrybutów do przechowywania danych obiektu Należy używać .removeAttr() zamiast .removeData() używając Numer ID

1

Właściwie to działa lepiej dla mnie. Ponieważ pozostawia atrybut nietknięty w elemencie, ale bez przypisanej mu wartości.

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

Spędziłem na to sporo czasu. Myślę, że jest błąd w JQuery. Skończyło się na tym wariancie również \ $ (thisTr) .find (".tdTspec"). Attr ("data-tspecno", "0"); \ –

0

.removeData() będzie tylko usunąć dane z jQuery wewnętrznego .data() cache więc wszelkie odpowiednie data- atrybuty na elemencie nie zostaną usunięte. Później wywołanie data() spowoduje ponowne pobranie wartości z atrybutu elementu data-. Aby temu zapobiec, użyj .removeAttr() wraz z .removeData(), aby również usunąć atrybut data-.

przykład:

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

Następnie ustawiony albo:

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