Was ist der Unterschied zwischen removeProp und removeAttr in JQuery 1.6?

8

Wenn Sie removeProp auf etwas, das Sie removeAttr verwendet haben sollten, wird es im Hintergrund fehlschlagen? Wird es funktionieren? Wird es tatsächlich das gesamte Attribut oder nur den darin enthaltenen Wert entfernen?

Wenn "checked" mit prop () hinzugefügt wurde, kann es mit removeAttr entfernt werden?

Viele Fragen!

    
Flyn San 05.05.2011, 07:39
quelle

3 Antworten

4

Ein Attribut eines Elements ist etwas wie "Klasse". Wohingegen seine Eigenschaft 'className' wäre.

Dies ist der Grund für das Hinzufügen von jQuery.prop und jQuery.propHooks in Version 1.6, um die Arbeit mit beiden zu vereinfachen.

Wenn die Eigenschaft also denselben Namen wie das Attribut hat, können Sie sowohl removeProp als auch removeAttr verwenden.

Ich habe eine ähnliche Frage im jQuery-Forum gestellt und folgende Antwort erhalten:

  

Ja, Attr ist für HTML-Attribute gedacht   wie sie genau definiert sind. prop ist   für Eigenschaften. Sagen wir zum Beispiel   Du hast einen Knoten elem mit Klasse   "etwas" (Rohelement nicht jQuery   Objekt). elem.className ist der   Eigentum, aber ist wo das   Attribut befindet sich. Ändern der Klasse   Attribut ändert auch die Eigenschaft   automatisch und umgekehrt.   Zur Zeit ist Attr verwirrt und   verwirrend, weil es versucht hat   Job von beiden Funktionen und es gibt   viele Bugs deswegen. Das   Einführung von jQuery.fn.prop wird   mehrere Blocker lösen, Code trennen   wie es hätte getrennt werden sollen   der Anfang und geben Entwickler   schnellere Funktionen zu tun, was sie tun   erwarte von ihnen zu tun. Lass mich eine a machen   Prozent für eine Sekunde und sage das von   meine Erfahrung in der Unterstützung IRC und   Lesen des Codes anderer, 95% der Nutzung   Fälle für Attr müssen nicht wechseln   zu stützen.

BEARBEITEN

Es kann am besten sein, entweder jQuery.attr oder jQuery.prop zu verwenden. Theres scheint ein merkwürdiges Verhalten zu sein, wenn man das geprüfte Attribut unter Verwendung beider setzt und entfernt.

Sehen Sie hier ein Beispiel: Ссылка

Es gibt einen Fehler in 1.6 mit ausgewählten: Ссылка

    
Tomgrohl 05.05.2011, 07:45
quelle
7

Der offizielle jQuery-Blog bietet eine sehr klare Erklärung:

  

In der Version 1.6 haben wir uns getrennt   die Handhabung von DOM-Attributen und DOM   Eigenschaften in separate Methoden. Das   neue .prop () -Methode setzt oder bekommt   Eigenschaften für DOM-Elemente und   .removeProp () entfernt Eigenschaften. Im   Die Vergangenheit, hat jQuery nicht klar gezeichnet   Linie zwischen Eigenschaften und   Attribute. Im Allgemeinen DOM-Attribute   repräsentieren den Status von DOM-Informationen   wie aus dem Dokument abgerufen, z   als Wertattribut im Markup   . DOM   Eigenschaften repräsentieren den dynamischen Zustand   des Dokuments; zum Beispiel wenn die   Benutzer klickt auf das Eingabeelement oben   und Typen def die .prop("value") ist   abcdef aber die .attr("value") bleibt   abc.

     

In den meisten Fällen behandelt der Browser die   Attributwert als Startwert   für die Eigenschaft, aber Boolean   Attribute wie aktiviert oder deaktiviert   haben ungewöhnliche Semantik.

     

Betrachten Sie zum Beispiel das Markup   %Code%. Das   Vorhandensein des geprüften Attributs   bedeutet, dass die Eigenschaft DOM <input type="checkbox" checked>   ist wahr, obwohl das Attribut   hat keinen Wert. Im Code   oben ist der geprüfte Attributwert   eine leere Zeichenfolge (oder .checked falls nein   Attribut wurde angegeben) aber die   Überprüfter Eigenschaftswert ist undefined .

     

Vor jQuery 1.6, true   gab den booleschen Eigenschaftswert zurück   ( .attr("checked") ) aber ab jQuery 1.6 gibt es zurück   der tatsächliche Wert des Attributs (an   leere Zeichenfolge), die sich nicht ändert   wenn der Benutzer das Kontrollkästchen anklickt   ändere seinen Zustand.

     

Es gibt mehrere Alternativen für   Überprüfen des aktuell überprüften Status   eines Kontrollkästchens. Das Beste und Meiste   performant ist die Verwendung der DOM-Eigenschaft   direkt, wie in true in einem   Event-Handler, wenn dieser auf den   Element, das angeklickt wurde. Im Code das   verwendet jQuery 1.6 oder neuer, das neue   Methode this.checked   Ruft den gleichen Wert wie auf    $(this).prop("checked") und ist relativ schnell.   Endlich der Ausdruck    this.checked funktioniert für alle   Versionen von jQuery.

    
Álvaro González 05.05.2011 08:22
quelle
0

Mit jQuery 1.6 versuchte ich, einen Menüeintrag zu klonen, der mehrere id -Attribute hatte, und das tat ich:

$('ul.menu').clone().filter('*').removeProp('id').appendTo('.sidebar');

Als ich die Elemente in Firebug inspizierte, hatte ich eine Menge id="undefined" - nicht was ich wollte. So, jetzt benutze ich removeAttr und es scheint viel besser zu funktionieren.

$('ul.menu').clone().filter('*').removeAttr('id').appendTo('.sidebar');

    
cwd 24.08.2011 17:30
quelle

Tags und Links