2013-05-17 7 views
20

Ich denke, ich benutze RemoveData korrekt, aber es scheint nicht zu funktionieren, hier ist, was ich in der Dev-Konsole sehe, könnte jemand erklären, was ich falsch mache?removeData() jquery-Methode funktioniert nicht

Ich gebe den aktuellen Datenattributwert aus, rufe removeData auf, gebe den Wert dann erneut aus und ist noch immer dort.

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

Die Benutzung ist. 'JQuery.removeData ($ ('Fragen> li') eq (1), "Feldlänge") ' – karthikr

+2

@karthikr Es gibt zwei Methoden: http://api.jquery.com/removeData/ und http://api.jquery.com/jquery.removeData/ – Blazemonger

Antwort

24

Es ist, weil Ihr data stammt im HTML data-fieldlength Attribut. Nach the docs:

Wenn .removeData („namen“) verwenden, jQuery versuchen wird, ein Daten- Attribut für das Element zu suchen, wenn kein Objekt mit diesem Namen in dem internen Daten-Cache ist. Um eine erneute Abfrage des Datenattributs zu vermeiden, setzen Sie den Namen auf einen Wert von entweder null oder undefiniert (z. B. .data ("name", undefined)) anstelle von .removeData().

Also statt

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

sollten Sie tun

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

Danke! Das funktioniert, obwohl ich immer noch ein wenig verschwommen bin, was genau passiert, nachdem ich die Erklärung in den Dokumenten gelesen habe. – turbo2oh

+2

Wie ich es verstehe: die '.data()' Methode sucht nach einem JavaScript-Wert für einen Wert, und wenn es keinen finden kann, schlürft es stattdessen in das 'data-' Attribut. Sie haben den internen JavaScript-Wert entfernt, sodass das Attribut "data-" wie für den Entwurf verwendet wurde. Wenn Sie stattdessen den JavaScript-Wert auf "null" setzen, ruft er das glücklich ab und ignoriert das Attribut "data-". – Blazemonger

+1

Ich dachte, dass die 'data-' Attribute nur einmal beim ersten Laden der Seite hineingeschlurft wurden - und wenn das der Fall wäre, hätte Ihr Code gut funktioniert. In der Tat, [die Dokumente] (http://api.jquery.com/removeData/) vorschlagen, dass Ansatz wurde * vor jQuery 1.4.3 – Blazemonger

28

Es gibt wenig gotcha ich, falls jemand stolpert es ...

klären wollte Wenn Sie haben HTML5 data-* Attribute für ein Element, das Sie verwenden müssen removeAttr() von jQuery anstelle von removeData(), wenn Sie sie aus dem Element im DOM entfernen möchten.

Zum Beispiel, um tatsächlich ein Datenattribut von einem Element entfernen Sie verwenden müssen:

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

Sie können lesen Werte wie diese mit $({selector}).data('fieldlength') aber removeData() tatsächlich sie nicht entfernen, wenn sie HTML sind Attribute auf einem Element in der Quelle der Seite (es löscht es nur im Speicher, so dass, wenn Sie es erneut mit jQuery abfragen erscheint entfernt worden sein).

Persönlich denke ich, dass dieses Verhalten gebrochen ist und ich bin sicher, dass eine Menge Leute herausfängt.

+0

Ich denke, dass es aus Codierungssicht besser wäre, das 'data-' Attribut im DOM zu behalten, aber die JavaScript '.data()' Variable auf 'null' zu setzen. Dies ergibt das gewünschte Ergebnis in jQuery, ohne das DOM-Attribut unnötig zu zerstören. Es besteht immer die Möglichkeit, dass es an anderer Stelle verwendet wird (z. B. könnten CSS-Stile davon abhängen). – Blazemonger

+1

@Blazemonger, als eine Notiz, habe ich versucht, 'Daten-remote' von wahr zu falsch zu ändern, und mit' .data() 'oder' .removeData() 'hat nicht funktioniert,' .removeAttr() ' hat gut funktioniert. Für diejenigen, denen das DOM-Attribut egal ist, funktioniert diese Methode großartig. – rmagnum2002

2

In Verstecktes Feld benutzerdefinierte Daten mit Attributobjektdaten speichern Sollte .removeAttr() anstelle von .removeData() mit ID

1

Eigentlich funktioniert das besser für mich verwenden. Weil das Attribut im Element intakt bleibt, ihm jedoch kein Wert zugewiesen ist.

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

Habe eine Menge Zeit damit verbracht. Ich denke, es gibt einen Bug in JQuery. Am Ende habe ich diese Variante auch benutzt \ $ (thisTr) .find (". TdTspec"). Attr ("data-tspecno", "0"); \ –

0

.removeData() wird nur Daten aus internen .data() jQuerys Cache entfernen so dass alle entsprechenden data- Attribute auf dem Element werden nicht entfernt. Ein späterer Aufruf an data() wird daher den Wert aus dem Attribut data- des Elements wieder abrufen. Um dies zu verhindern, verwenden Sie .removeAttr() neben .removeData(), um das Attribut data- ebenfalls zu entfernen.

Beispiel:

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

Dann setzen entweder:

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