So jQuery 1.6 hat die neue Funktion prop()
.
$(selector).click(function(){
//instead of:
this.getAttribute('style');
//do i use:
$(this).prop('style');
//or:
$(this).attr('style');
})
oder machen sie in diesem Fall dasselbe?
Und wenn ich sie zu Schalter müssen mit prop()
, alle alten attr()
Anrufe brechen , wenn ich auf 1,6 wechseln?
AKTUALISIEREN
selector = '#id'
$(selector).click(function() {
//instead of:
var getAtt = this.getAttribute('style');
//do i use:
var thisProp = $(this).prop('style');
//or:
var thisAttr = $(this).attr('style');
console.log(getAtt, thisProp, thisAttr);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
<div id='id' style="color: red;background: orange;">test</div>
(Siehe auch diese Geige: http://jsfiddle.net/maniator/JpUF2/ )
Die Konsole protokolliert die getAttribute
als Zeichenfolge und die attr
als Zeichenfolge, aber die prop
als CSSStyleDeclaration
, warum? Und wie wirkt sich das in Zukunft auf meine Codierung aus?
Antworten:
Update 1. November 2012
Meine ursprüngliche Antwort gilt speziell für jQuery 1.6. Mein Rat bleibt das gleiche , aber jQuery 1.6.1 Dinge etwas geändert: angesichts des vorhergesagten Haufen zerbrochener Websites, die jQuery - Team zurückgekehrt ,
attr()
um etwas in der Nähe (aber nicht genau das gleiche wie) sein altes Verhalten für Boolesche Attribute . John Resig hat auch darüber gebloggt . Ich kann die Schwierigkeit sehen, in der sie sich befanden, bin aber immer noch nicht mit seiner Empfehlung einverstandenattr()
.Ursprüngliche Antwort
Wenn Sie bisher nur jQuery und nicht direkt das DOM verwendet haben, kann dies eine verwirrende Änderung sein, obwohl dies konzeptionell definitiv eine Verbesserung darstellt. Nicht so gut für die Unmengen von Websites, die jQuery verwenden und die aufgrund dieser Änderung nicht mehr funktionieren.
Ich werde die Hauptprobleme zusammenfassen:
prop()
eher alsattr()
.prop()
das getan , wasattr()
früher getan wurde. Das Ersetzen von Anrufenattr()
durchprop()
in Ihrem Code funktioniert im Allgemeinen.checked
Eigenschaft ein Boolescher Wert, diestyle
Eigenschaft ist ein Objekt mit individuellen Eigenschaften für jeden Stil, diesize
Eigenschaft ist eine Zahl.value
undchecked
: Bei diesen Attributen repräsentiert die Eigenschaft immer den aktuellen Status, während das Attribut (außer in alten Versionen von IE) entspricht den Standardwert / checkedness des Eingangs (im reflektiertendefaultValue
/defaultChecked
Immobilien).Wenn Sie ein jQuery-Entwickler sind und von diesem ganzen Geschäft über Eigenschaften und Attribute verwirrt sind, müssen Sie einen Schritt zurücktreten und ein wenig darüber lernen, da jQuery nicht mehr so sehr versucht, Sie vor diesen Dingen zu schützen. Für das maßgebliche, aber etwas trockene Wort zu diesem Thema gibt es die Spezifikationen: DOM4 , HTML DOM , DOM Level 2 , DOM Level 3 . Die DOM-Dokumentation von Mozilla ist für die meisten modernen Browser gültig und leichter zu lesen als die technischen Daten. Daher ist die DOM-Referenz möglicherweise hilfreich. Es gibt einen Abschnitt über Elementeigenschaften .
Betrachten Sie als Beispiel dafür, wie Eigenschaften einfacher zu handhaben sind als Attribute, ein Kontrollkästchen, das zunächst aktiviert ist. Hier sind zwei mögliche Teile von gültigem HTML, um dies zu tun:
Wie finden Sie heraus, ob das Kontrollkästchen mit jQuery aktiviert ist? Schauen Sie sich den Stapelüberlauf an und Sie werden häufig die folgenden Vorschläge finden:
if ( $("#cb").attr("checked") === true ) {...}
if ( $("#cb").attr("checked") == "checked" ) {...}
if ( $("#cb").is(":checked") ) {...}
Dies ist tatsächlich die einfachste Sache der Welt, die mit der
checked
Booleschen Eigenschaft zu tun hat, die seit 1995 in allen wichtigen skriptfähigen Browsern existiert und einwandfrei funktioniert:if (document.getElementById("cb").checked) {...}
Die Eigenschaft macht auch das Aktivieren oder Deaktivieren des Kontrollkästchens trivial:
document.getElementById("cb").checked = false
In jQuery 1.6 wird dies eindeutig
$("#cb").prop("checked", false)
Die Idee, das
checked
Attribut zum Erstellen von Skripten für ein Kontrollkästchen zu verwenden, ist nicht hilfreich und unnötig. Die Eigenschaft ist, was Sie brauchen.checked
Attributs richtig aktiviert oder deaktiviert wirdquelle
value
Beispiel Tims Beispiel an. Eine aufgerufene Funktionattr
, die die Eigenschaftvalue
und nicht das Attribut "Wert" abruft , ist wenig sinnvoll (und sie können unterschiedlich sein). In Zukunft wird es klarer sein,attr
Attribute undprop
Eigenschaften auszuführen, obwohl der Übergang für einige schmerzhaft sein wird. Verstehen Sie das nicht falsch, es gibt nichts Schöneres, als zurückzutreten und die technischen Daten zu lesen, um eine Vorstellung von den Eigenschaften zu bekommen.value
zum Beispiel) durchschreiben , aber versuchen wir, dies größtenteils zu ignorieren. In 99% der Fälle möchten Sie mit Requisiten arbeiten. Wenn Sie mit einem tatsächlichen Attribut arbeiten müssen, wissen Sie das wahrscheinlich.value
Eigenschaft einer Eingabe ändert ihrvalue
Attribut in modernen Browsern nicht." Ich habe nicht gedacht, dass dies der Fall ist. Deshalb habe ich angefangen, es als Beispiel zu verwenden, aber als ich anfing, das Beispiel zu codieren, verdammt Wenn es nicht auf Chrome, Firefox, Opera, IE ... aktualisiert wurde - jsbin.com/ahire4 Es stellte sich heraus, dass ich eininput[type="button"]
für mein Experiment verwendet habe. Es ist nicht aktualisiert das Attribut auf eineminput[type="text"]
- jsbin.com/ahire4/2 Sprechen Sie über die gewundene !! Nicht nur das Element, sondern auch die Art ...Ich denke, Tim hat es ganz gut gesagt , aber lasst uns zurücktreten:
Ein DOM-Element ist ein Objekt, eine Sache im Speicher. Wie die meisten Objekte in OOP verfügt es über Eigenschaften . Es enthält auch separat eine Karte der für das Element definierten Attribute (normalerweise aus dem Markup, das der Browser gelesen hat, um das Element zu erstellen). Einige Eigenschaften des Elements erhalten ihre Anfangswerte von Attributen mit demselben oder ähnlichen Namen (
value
erhält seinen Anfangswert vom Attribut "value";href
erhält seinen Anfangswert vom Attribut "href", aber es ist nicht genau der gleiche Wert;className
vom Attribut "Klasse"). Andere Eigenschaften erhalten ihre Anfangswerte auf andere Weise: BeispielsweiseparentNode
erhält die Eigenschaft ihren Wert basierend auf dem übergeordneten Element.style
Eigenschaft, ob es ein "style" -Attribut hat oder nicht.Betrachten wir diesen Anker auf einer Seite unter
http://example.com/testing.html
:Einige unentgeltliche ASCII-Kunstwerke (und viele Dinge weglassen):
Beachten Sie, dass die Eigenschaften und Attribute unterschiedlich sind.
Obwohl sie unterschiedlich sind, schreiben einige Eigenschaften auf das Attribut zurück, von dem sie abgeleitet wurden, wenn Sie sie festlegen, da sich all dies entwickelt hat, anstatt von Grund auf neu entworfen zu werden. Aber nicht alle tun dies, und wie Sie von
href
oben sehen können, ist das Mapping nicht immer ein direktes "Weitergeben des Werts", manchmal ist eine Interpretation erforderlich.Wenn ich davon spreche, dass Eigenschaften Eigenschaften eines Objekts sind, spreche ich nicht abstrakt. Hier ist ein Nicht-jQuery-Code:
(Diese Werte entsprechen den meisten Browsern; es gibt einige Abweichungen.)
Das
link
Objekt ist eine echte Sache, und Sie können sehen, dass es einen echten Unterschied zwischen dem Zugriff auf eine Eigenschaft und dem Zugriff auf ein Attribut gibt .Wie Tim sagte, die überwiegende Mehrheit will der Zeit, wir mit Eigenschaften zu arbeiten. Dies liegt zum Teil daran, dass ihre Werte (sogar ihre Namen) in allen Browsern konsistenter sind. Wir möchten meistens nur mit Attributen arbeiten, wenn keine zugehörige Eigenschaft vorhanden ist (benutzerdefinierte Attribute) oder wenn wir wissen, dass für dieses bestimmte Attribut das Attribut und die Eigenschaft nicht 1: 1 sind (wie bei
href
und "href" oben). .Die Standardeigenschaften sind in den verschiedenen DOM-Spezifikationen aufgeführt:
Diese Spezifikationen haben ausgezeichnete Indizes und ich empfehle, Links zu ihnen griffbereit zu halten. Ich benutze sie die ganze Zeit.
Zu den benutzerdefinierten Attributen gehören beispielsweise alle
data-xyz
Attribute, die Sie möglicherweise auf Elemente setzen, um Metadaten für Ihren Code bereitzustellen (jetzt, da dies ab HTML5 gültig ist, solange Sie sich an dasdata-
Präfix halten). (Neuere Versionen von jQuery ermöglichen Ihnen den Zugriff aufdata-xyz
Elemente über diedata
Funktion, aber diese Funktion ist nicht nur ein Accessor fürdata-xyz
Attribute [sie macht mehr und weniger als das]. Wenn Sie ihre Funktionen nicht tatsächlich benötigen, würde ich dieattr
Funktion zur Interaktion verwenden mitdata-xyz
Attribut.)attr
Früher hatte die Funktion eine verworrene Logik, um das zu bekommen, was sie wollten, anstatt das Attribut buchstäblich zu bekommen. Es verschmolz die Konzepte. Der Umzug nachprop
undattr
sollte sie entmischen. Kurz in v1.6.0 jQuery zu weit gegangen in dieser Hinsicht, aber die Funktionalität wurde schnell wieder hinzugefügt , umattr
zu handhaben, die gemeinsame Situationen , in denen Menschen nutzen ,attr
wenn technisch sollen sie nutzenprop
.quelle
.attr('class', 'bla')
funktioniert wie erwartet für mich in 1.7.0 , 1.7.1 und 1.7.2 unter Chrome 17, Firefox 11, Opera 11, IE6, IE8, IE9 und Safari 5..data
- Es liest den Standardwert des Attributs, falls vorhanden, aber wenn Sie darauf schreiben, ändert es eine versteckte Eigenschaft des Elements und aktualisiert das Attribut nicht.Diese Änderung hat für jQuery lange auf sich warten lassen. Seit Jahren begnügen sie sich mit einer Funktion namens
attr()
, die hauptsächlich DOM-Eigenschaften abruft, nicht mit dem Ergebnis, das Sie vom Namen erwarten würden. Die Trennung vonattr()
undprop()
sollte dazu beitragen, die Verwirrung zwischen HTML-Attributen und DOM-Eigenschaften zu verringern.$.fn.prop()
greift auf die angegebene DOM-Eigenschaft zu, während$.fn.attr()
das angegebene HTML-Attribut erfasst wird.Um zu verstehen, wie sie funktionieren, finden Sie hier eine ausführliche Erläuterung des Unterschieds zwischen HTML-Attributen und DOM-Eigenschaften:
HTML-Attribute
Syntax:
<body onload="foo()">
Zweck: Ermöglicht dem Markup, Daten für Ereignisse, Rendering und andere Zwecke zuzuordnen.
Visualisierung: Das Klassenattribut wird hier im Body angezeigt. Es ist über den folgenden Code zugänglich:
Attribute werden in Zeichenfolgenform zurückgegeben und können von Browser zu Browser inkonsistent sein. In einigen Situationen können sie jedoch von entscheidender Bedeutung sein. Wie oben beispielhaft dargestellt, erwartet der IE 8 Quirks Mode (und darunter) den Namen einer DOM-Eigenschaft in get / set / removeAttribute anstelle des Attributnamens. Dies ist einer von vielen Gründen, warum es wichtig ist, den Unterschied zu kennen.
DOM-Eigenschaften
Syntax:
document.body.onload = foo;
Zweck: Ermöglicht den Zugriff auf Eigenschaften, die zu Elementknoten gehören. Diese Eigenschaften ähneln Attributen, sind jedoch nur über JavaScript zugänglich. Dies ist ein wichtiger Unterschied, der zur Verdeutlichung der Rolle von DOM-Eigenschaften beiträgt. Beachten Sie, dass sich die Attribute vollständig von den Eigenschaften unterscheiden , da diese Zuweisung des Ereignishandlers unbrauchbar ist und das Ereignis nicht empfängt (body hat kein Onload-Ereignis, nur ein Onload-Attribut).
Visualisierung:
Hier finden Sie eine Liste der Eigenschaften unter der Registerkarte "DOM" in Firebug. Dies sind DOM-Eigenschaften. Sie werden sofort einige von ihnen bemerken, da Sie sie zuvor verwendet haben, ohne es zu wissen. Ihre Werte erhalten Sie über JavaScript.
Dokumentation
Beispiel
HTML:
<textarea id="test" value="foo"></textarea>
JavaScript:
alert($('#test').attr('value'));
In früheren Versionen von jQuery wird eine leere Zeichenfolge zurückgegeben. In 1.6 wird der richtige Wert zurückgegeben
foo
.Ohne einen Blick auf den neuen Code für eine der beiden Funktionen geworfen zu haben, kann ich mit Zuversicht sagen, dass die Verwirrung mehr mit dem Unterschied zwischen HTML-Attributen und DOM-Eigenschaften zu tun hat als mit dem Code selbst. Hoffentlich hat dies einige Dinge für Sie geklärt.
-Matt
quelle
$.prop()
Ruft DOM-Eigenschaften ab und$.attr()
ruft HTML-Attribute ab. Ich versuche, die Lücke psychologisch zu schließen, damit Sie den Unterschied zwischen den beiden verstehen können.$('#test').prop('value')
also nichts zurück? Auch nicht.attr('checked')
für ein Kontrollkästchen? Aber früher? Jetzt müsstest du es ändernprop('checked')
? Ich verstehe die Notwendigkeit dieser Unterscheidung nicht - warum ist es wichtig, zwischen HTML-Attributen und DOM-Eigenschaften zu unterscheiden? Was ist der übliche Anwendungsfall, der diese Änderung "lange auf sich warten lässt" ? Was ist falsch daran, die Unterscheidung zwischen den beiden zu abstrahieren, da sich ihre Anwendungsfälle anscheinend größtenteils überschneiden?value
Dies ist einer der offensichtlichsten Fälle, da dievalue
Eigenschaft den aktuellen Wert eines Felds angibt, dasvalue
Attribut jedoch den ursprünglichen Wertvalue="..."
angibt, der im Attribut deklariert wurde , bei dem es sich tatsächlich um diedefaultValue
Eigenschaft handelt. (Obwohl dieser spezielle Fall erneut durch Fehler in IE <9 verwirrt wird.)attr('value', ...)
in jQuery <1.6 wird die Eigenschaft festgelegt, sodass sich der aktuelle Wert ändert und der Standardwert nicht. In 1.6 wird das Attribut festgelegt, sodass sich theoretisch der Standardwert ändert und der aktuelle Wert nicht. Es gibt jedoch (mehr) Browser-Inkonsistenzen hinsichtlich der genauen Einstellung desvalue
Attributs. Im IE wird auch der aktuelle Wert festgelegt. In einigen Browsern wird der aktuelle Wert nur festgelegt, wenn der aktuelle Wert noch nicht festgelegt wurde. [weint]Eine Eigenschaft befindet sich im DOM. Ein Attribut befindet sich im HTML-Code, der im DOM analysiert wird.
Weitere Details
Wenn Sie ein Attribut ändern, wird die Änderung im DOM angezeigt (manchmal mit einem anderen Namen).
Beispiel: Durch Ändern des
class
Attributs eines Tags wird dieclassName
Eigenschaft dieses Tags im DOM geändert . Wenn Sie kein Attribut für ein Tag haben, haben Sie immer noch die entsprechende DOM-Eigenschaft mit einem leeren oder einem Standardwert.Beispiel: Während Ihr Tag kein
class
Attribut hat, ist die DOM-EigenschaftclassName
mit einem leeren Zeichenfolgenwert vorhanden.bearbeiten
Wenn Sie das eine ändern, wird das andere von einem Controller geändert und umgekehrt. Dieser Controller befindet sich nicht in jQuery, sondern im nativen Code des Browsers.
quelle
jQuery('p').prop('className', 'foo');
in der Chrome-Konsole und Sie werden sehen, wie jeder Absatz dasclass
Attribut thg erhält'foo'
. Natürlich nicht im Quellcode, der vom Server kommt. Das ist eine Konstante.Nur die Unterscheidung zwischen HTML-Attributen und DOM-Objekten sorgt für Verwirrung. Für diejenigen, die gerne auf die DOM-Elemente einwirken, sind native Eigenschaften wie
this.src
this.value
this.checked
usw..prop
ein sehr herzliches Willkommen in der Familie. Für andere ist es nur eine zusätzliche Verwirrungsebene. Lassen Sie uns das klären.Der einfachste Weg, um den Unterschied zwischen
.attr
und zu erkennen,.prop
ist das folgende Beispiel:$('input').attr('blah')
: kehrt'hello'
wie erwartet zurück. Keine Überraschungen hier.$('input').prop('blah')
: gibt zurückundefined
- weil es versucht wird[HTMLInputElement].blah
- und es gibt keine solche Eigenschaft für dieses DOM-Objekt. Es existiert nur im Bereich als Attribut dieses Elements, dh[HTMLInputElement].getAttribute('blah')
Jetzt ändern wir ein paar Dinge wie folgt:
$('input').attr('blah')
: kehrt'apple'
eh zurück? Warum nicht "Birne", da dies zuletzt auf dieses Element gesetzt wurde. Da die Eigenschaft für das Eingabeattribut und nicht für das DOM-Eingabeelement selbst geändert wurde, funktionieren sie im Grunde fast unabhängig voneinander.$('input').prop('blah')
: kehrt zurück'pear'
Das, womit Sie wirklich vorsichtig sein müssen, ist, die Verwendung dieser für dieselbe Eigenschaft in Ihrer Anwendung aus dem oben genannten Grund nicht zu mischen .
Sehen Sie sich eine Geige an, die den Unterschied demonstriert: http://jsfiddle.net/garreh/uLQXc/
.attr
vs.prop
:Runde 1: Stil
.attr('style')
- gibt Inline-Stile für das übereinstimmende Element zurück, d. h"font:arial;"
.prop('style')
- gibt ein Stildeklarationsobjekt zurück, dhCSSStyleDeclaration
Runde 2: Wert
.attr('value')
- gibt'hello'
* zurück.prop('value')
-- kehrt zurück'i changed the value'
* Hinweis: jQuery verfügt aus diesem Grund über eine
.val()
Methode, die intern gleichwertig ist.prop('value')
quelle
TL; DR
Verwenden Sie
prop()
überattr()
in der Mehrzahl der Fälle.Eine Eigenschaft ist der aktuelle Status des Eingabeelements. Ein Attribut ist der Standardwert.
Eine Eigenschaft kann verschiedene Arten von Dingen enthalten. Ein Attribut kann nur Zeichenfolgen enthalten
quelle
prop() and when to go for attr()
. Warten auf Antwort :)Schmutzige Kontrolle
Dieses Konzept bietet ein Beispiel, bei dem der Unterschied erkennbar ist: http://www.w3.org/TR/html5/forms.html#concept-input-checked-dirty
Versuch es:
prop
Kontrollkästchen wurde aktiviert. KNALL!Bei einigen Attributen wie
disabled
onbutton
wird beim Hinzufügen oder Entfernen des Inhaltsattributsdisabled="disabled"
die Eigenschaft (in HTML5 als IDL-Attribut bezeichnet) immer umgeschaltet, da http://www.w3.org/TR/html5/forms.html#attr-fe-disabled Folgendes sagt:Sie könnten also damit durchkommen, obwohl es hässlich ist, da es HTML ohne Notwendigkeit ändert.
Bei anderen Attributen wie
checked="checked"
oninput type="checkbox"
werden die Dinge unterbrochen, da sie beim Klicken schmutzig werden und das Hinzufügen oder Entfernen deschecked="checked"
Inhaltsattributs die Überprüfung nicht mehr umschaltet .Aus diesem Grund sollten Sie meistens verwenden
.prop
, da dies die effektive Eigenschaft direkt beeinflusst, anstatt sich auf komplexe Nebenwirkungen beim Ändern des HTML-Codes zu verlassen.quelle
checked
Attribut:checked="checked"
Alles ist im Dokument :
Also benutze Requisite!
quelle
$.attr()
Ich habe die meiste Zeit damit gearbeitet, nicht "manchmal". Die dadurch verursachte Verwirrung ist bis heute spürbar. Leider habe ich große Probleme, einen endgültigen Lesevorgang für HTML-Attribute im Vergleich zu DOM-Eigenschaften zu finden. Daher könnte ich hier gleich eine Antwort schreiben.Attribute befinden sich in Ihrem HTML- Textdokument / Ihrer HTML- Textdatei (== Stellen Sie sich vor, dies ist das Ergebnis Ihres analysierten HTML-Markups), während sich
Eigenschaften im HTML- DOM-Baum befinden (== im Grunde eine tatsächliche Eigenschaft eines Objekts im JS-Sinne).
Wichtig ist, dass viele von ihnen synchronisiert werden (wenn Sie die
class
Eigenschaft aktualisieren ,class
wird auch das Attribut in HTML aktualisiert; andernfalls). Aber einige Attribute können zu einem unerwarteten Eigenschaften synchronisiert werden - zB Attributchecked
entspricht EigenschaftdefaultChecked
, so dass.prop('checked')
Wert, aber wird sich nicht ändern.attr('checked')
und.prop('defaultChecked')
Werte$('#input').prop('defaultChecked', true)
ändert sich ebenfalls.attr('checked')
, dies ist jedoch für ein Element nicht sichtbar.Und hier ist eine Tabelle, die zeigt, wo
.prop()
bevorzugt wird (obwohl.attr()
noch verwendet werden kann).Warum sollten Sie manchmal .prop () anstelle von .attr () verwenden, wenn letzteres offiziell empfohlen wird?
.prop()
kann jeden Typ zurückgeben - string, integer, boolean; while gibt.attr()
immer einen String zurück..prop()
soll etwa 2,5 mal schneller sein als.attr()
.quelle
$('#myImageId').prop('src', 'http://example.com/img.png')
,var class = $('.myDivClass').prop('class')
oder$('#myTextBox').prop('type', 'button')
. Und so weiter ....prop()
funktioniert gut mit allen Eigenschaften. Sie möchten nicht alle Eigenschaften in der.prop()
Spalte markieren , oder?.prop()
bevorzugt wird (obwohl.attr()
es noch verwendet werden kann)".attr()
zum Definieren eines Ereignisses, was.prop()
nicht kann. So :$('.myDiv').attr('onclick', 'alert("Hello world!")')
. Wenn Sie ändern.attr()
zu.prop()
, wird es nicht funktionieren. Insgesamt denke ich, dass es keinen Grund gibt.attr()
, den Wert festzulegen oder abzurufenid/class/href/checked/src.....
. Beachten Sie, dass ich nicht sage, dass Sie falsch liegen..attr()
::.prop()
::quelle
Normalerweise möchten Sie Eigenschaften verwenden. Verwenden Sie Attribute nur für:
<input value="abc">.
quelle
attributes
-> HTMLproperties
-> DOMquelle
attirbutes
auch eines der Eigentum vonDOM
Vor jQuery 1.6 berücksichtigte die
attr()
Methode beim Abrufen von Attributen manchmal Eigenschaftswerte. Dies führte zu einem eher inkonsistenten Verhalten.Die Einführung der
prop()
Methode bietet eine Möglichkeit, Eigenschaftswerte explizit abzurufen und.attr()
Attribute abzurufen.Die Dokumente:
jQuery.attr()
Ruft den Wert eines Attributs für das erste Element in der Gruppe der übereinstimmenden Elemente ab.jQuery.prop()
Ruft den Wert einer Eigenschaft für das erste Element in der Gruppe der übereinstimmenden Elemente ab.quelle
Erinnern Sie sich vorsichtig an die Verwendung
prop()
, Beispiel:Die obige Funktion wird verwendet, um zu überprüfen, ob das Kontrollkästchen1 aktiviert ist oder nicht, falls aktiviert: return 1; wenn nicht: return 0. Funktion prop () wird hier als GET-Funktion verwendet.
Die obige Funktion wird verwendet, um das zu aktivierende Kontrollkästchen1 zu setzen und IMMER 1 zurückzugeben. Jetzt wird die Funktion prop () als SET-Funktion verwendet.
Mach dir keine Sorgen.
P / S: Wenn ich die Eigenschaft Image src überprüfe . Wenn der src leer ist, gibt prop die aktuelle URL der Seite zurück (falsch) und attr gibt eine leere Zeichenfolge zurück (rechts).
quelle
<img src="smiley.gif" alt="Smiley face" width="42" height="42" onclick="alert($(this).prop('src'))">
. Es sollte funktionieren und den Bildspeicherort zurückgeben.Eines
.attr()
kann das.prop()
nicht: CSS-Selektoren beeinflussenHier ist ein Problem, das ich in den anderen Antworten nicht gesehen habe.
CSS-Auswahl
[name=value]
.attr('name', 'value')
.prop('name', 'value')
.prop()
betrifft nur wenige Attributselektoreninput[name]
(danke @TimDown ).attr()
betrifft alle Attributselektoreninput[value]
input[naame]
span[name]
input[data-custom-attribute]
(Beides wirkt sich nicht.data('custom-attribute')
auf diesen Selektor aus.)quelle
Meistens möchten wir eher für DOM-Objekte als für benutzerdefinierte Attribute wie verwenden
data-img, data-xyz
.Auch einige Unterschiede beim Zugriff auf
checkbox
Wert undhref
mitattr()
undprop()
als Sache ändern sich mit der DOM-Ausgabe mitprop()
als vollständiger Verknüpfung vonorigin
undBoolean
Wert für Kontrollkästchen(pre-1.6)
Wir können nur mit
prop
anderen als den angegebenen auf DOM-Elemente zugreifenundefined
Code-Snippet anzeigen
quelle
In prop () vs attr () gibt es noch einige weitere Überlegungen:
selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked und defaultSelected..etc sollten mit der Methode .prop () abgerufen und festgelegt werden. Diese haben keine entsprechenden Attribute und sind nur Eigenschaften.
Kontrollkästchen für Eingabetyp
Die prop-Methode gibt einen booleschen Wert für "geprüft", "ausgewählt", "deaktiviert", "readOnly..etc" zurück, während attr eine definierte Zeichenfolge zurückgibt. Sie können also .prop ('checked') direkt in if-Bedingung verwenden.
.attr () ruft intern .prop () auf, sodass die .attr () -Methode etwas langsamer ist als der direkte Zugriff über .prop ().
quelle
Die Antwort von Gary Hole ist sehr relevant, um das Problem zu lösen, wenn der Code so geschrieben ist
Da die Prop-Funktion das
CSSStyleDeclaration
Objekt zurückgibt, funktioniert der obige Code in einigen Browsern nicht richtig (IE8 with Chrome Frame Plugin
in meinem Fall mit getestet ).So ändern Sie es in folgenden Code
Problem gelöst.
quelle