jQuery attr vs prop?
Teraz to nie jest po prostu kolejny Jaka jest różnica pytanie , zrobiłem kilka testów(http://jsfiddle.net/ZC3Lf/) modyfikowanie prop
i attr
z <form action="/test/"></form>
z wynikiem:
1) Test modyfikacji prop
Prop:http://fiddle.jshell.net/test/1
Attr:http://fiddle.jshell.net/test/1
2) Test modyfikacji Attr
Prop:http://fiddle.jshell.net/test/1
Attr:/test/1
3) Attr następnie test modyfikacji Prop
Prop:http://fiddle.jshell.net/test/11
Attr:http://fiddle.jshell.net/test/11
4) Prop then Attr Modification test
Prop:http://fiddle.jshell.net/test/11
Attr:http://fiddle.jshell.net/test/11
Teraz jestem zdezorientowany co do kilku rzeczy, jeśli chodzi o moją wiedzę:
Prop: wartość w bieżącym stanie po jakichkolwiek modyfikacjach za pomocą JavaScript
Attr: wartość zdefiniowana w html podczas ładowania strony.
Jeśli to prawda,
- dlaczego modyfikowanie
prop
wydaje się robićaction
w pełni kwalifikowany, i odwrotnie, dlaczego modyfikowanie atrybutu nie? - dlaczego modyfikowanie
prop
w1)
modyfikuje atrybut, który nie ma dla mnie sensu? - dlaczego modyfikowanie
attr
w2)
modyfikuje właściwość, czy mają być w ten sposób połączone?
Kod Badania
HTML
JavaScript
var element = $('form');
var property = 'action';
/*You should not need to modify below this line */
var body = $('body');
var original = element.attr(property);
body.append('<h1>Prop Modification test</h1>');
element.prop(property, element.prop(property) + 1);
body.append('Prop: '+element.prop(property)+'<br />');
body.append('Attr: '+element.attr(property)+'<hr />');
//reset
element.prop(property, original);
element.attr(property, original);
body.append('<h1>Attr Modification test</h1>');
element.attr(property, element.attr(property) + 1);
body.append('Prop: '+element.prop(property)+'<br />');
body.append('Attr: '+element.attr(property)+'<hr />');
//reset
element.prop(property, original);
element.attr(property, original);
body.append('<h1>Attr then Prop Modification test</h1>');
element.attr(property, element.attr(property) + 1);
element.prop(property, element.prop(property) + 1);
body.append('Prop: '+element.prop(property)+'<br />');
body.append('Attr: '+element.attr(property)+'<hr />');
//reset
element.prop(property, original);
element.attr(property, original);
body.append('<h1>Prop then Attr Modification test</h1>');
element.prop(property, element.prop(property) + 1);
element.attr(property, element.attr(property) + 1);
body.append('Prop: '+element.prop(property)+'<br />');
body.append('Attr: '+element.attr(property)+'<hr />');
4 answers
Niestety żaden z twoich linków nie działa: (
Pewien wgląd, attr
jest dla wszystkich atrybutów. prop
jest dla właściwości.
W starszych wersjach jQuery (attr. Aby dostać się do nieruchomości DOM takich jak nodeName
, selectedIndex
, albo defaultValue
trzeba było zrobić coś takiego:
var elem = $("#foo")[0];
if ( elem ) {
index = elem.selectedIndex;
}
To było do bani, więc prop
Dodano:
index = $("#foo").prop("selectedIndex");
To było świetne, ale irytujące, że nie było kompatybilne wstecz, jak:
<input type="checkbox" checked>
Nie ma atrybutu checked
, ale ma właściwość o nazwie checked
.
Więc, w ostatecznej kompilacji 1.6, attr
robi również prop
tak, że rzeczy się nie zepsuły. Niektórzy ludzie chcieli, aby to była czysta przerwa, ale myślę, że właściwa decyzja została podjęta, ponieważ rzeczy nie pękają wszędzie!
Odnośnie:
Prop: wartość w bieżącym stanie po jakichkolwiek modyfikacjach za pomocą JavaScript
Attr: wartość zdefiniowana w html podczas ładowania strony.
To nie zawsze prawda, wiele razy atrybut jest rzeczywiście zmieniany, ale dla właściwości takich jak zaznaczone, nie ma atrybutu do zmiany, więc musisz użyć właściwości.
Bibliografia:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-30 17:16:01
Istnieje wyraźny przypadek, aby zobaczyć różnice między .prop i .attr
Rozważ poniższy HTML:
<form name="form" action="#">
<input type="text" name="action" value="myvalue" />
<input type="submit" />
</form>
<pre id="return">
</pre>
I js poniżej używając jQuery:
$(document).ready(function(){
$("#return").append("$('form').prop('action') : " + $('form').prop('action') + '\r\n');
$("#return").append("$('form').attr('action') : " + $('form').attr('action') + '\r\n');
$("#return").append("document.form.action : " + document.form.action);
});
$('Forma').prop ('akcja') zwróci dokument.forma.action node = > HTMLInputElement
$('form').attr ('action') zwróci atrybut action = > #
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-11 12:36:54
Próbowałem tego
console.log(element.prop(property));
console.log(element.attr(property));
I wychodzi jak poniżej
http://fiddle.jshell.net/test/
/test/
Może to wskazywać, że {[2] } jest znormalizowane tylko wtedy, gdy jest odczytywane z prop
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-06 09:13:43
Od jquery 1.6.1 + attr () zwraca / zmienia właściwość tak jak przed 1.6. tak więc twoje testy nie mają większego sensu.
Należy pamiętać o drobnych zmianach wartości zwrotnych.
Np.
Attr ('sprawdzone'): przed 1.6 true/false jest returend, od 1.6.1. zwracane jest"checked" / undefined.
Attr ('selected'): przed zwracaniem 1.6 true/false, od 1.6.1 zwracane jest "selected"/undefined
Szczegółowy przegląd tego tematu w języku niemieckim można znaleźć tutaj:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-27 12:35:45