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 w 1) modyfikuje atrybut, który nie ma dla mnie sensu?
  • dlaczego modyfikowanie attr w 2) 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 />');
Author: eebbesen, 2012-11-06

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:

Http://blog.jquery.com/2011/05/03/jquery-16-released/

Http://ejohn.org/blog/jquery-16-and-attr

 70
Author: Rich Bradshaw,
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 = > #

 3
Author: SmasherHell,
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.

 1
Author: Haocheng,
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:

Http://mabraham.de/jquery-prop-attr-val-richtig-verwenden/

 1
Author: Martin Abraham,
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