JQuery возвращает непустые входные данные с пустым селектором атрибута - PullRequest
2 голосов
/ 29 июля 2011

Отправьте это здесь для обсуждения, прежде чем отправлять сообщение об ошибке в JQuery.

Рассмотрите эту скрипку:

http://jsfiddle.net/tWPS6/2/

Я установил атрибут значения одного ввода в HTMLДругой использует Javascript.Затем я прошу JQuery выбрать пустые входы (входы со значением == "").Он возвращает длину 1 (и один вход в нем - # input2).

Как будто этот пустой селектор атрибута выбирает на основе исходного значения входных тегов в исходном HTML, а нетекущее значение, даже если любое другое средство проверки атрибута значения (например, .value или .val ()) покажет мне, что оно на самом деле не пустое.

Это похоже на ошибку в JQuery.Правильно?

Ответы [ 2 ]

4 голосов
/ 29 июля 2011

В первую очередь:

Это не ошибка в jQuery.

Существует существенная разница между атрибутом элемента :

var attr = element.getAttribute('foo');

и элемент свойство:

var prop = element.foo;

Этот ответ очень хорошо объясняет это - короткая версия - атрибут против свойства беспорядочный, и браузерыНе всегда получается правильно, но вы почти всегда хотите использовать свойство, а не атрибут при работе с DOM .

Забудьте оатрибутов.Вы почти всегда хотите свойство, а не атрибут.Если существует свойство и атрибут с одинаковым именем, свойство всегда представляет текущее состояние, а атрибут (в большинстве браузеров) представляет исходное состояние.Это влияет на свойства, такие как свойство value <input> elements.


Если вы теперь понимаете кластер атрибутов! @ # $, Вы должны надеяться увидеть, куда это идет.

Селектор 'input[value=""]' является селектором атрибута .Это означает, что это не селектор свойств.В обоих раундах в вашем примере $('input[value=""]') соответствует только <input id="input2" value=""/>, поскольку этот элемент (и только этот элемент) является тем, который:

  • имеет атрибут value и
  • Этот атрибут value равен пустой строке.

.val() задает свойство value элемента <input>, а не атрибут value.Селектор атрибута соответствует, как следует из названия, атрибуту элемента, поэтому, конечно, он не выберет ничего другого, если атрибут не изменился.

Кроме того, jQuery делает все виды модных вещей под капотом.который:

  • Обеспечивает согласованное поведение в разных браузерах, а
  • Обеспечивает поведение, согласующееся с документацией, и
  • Особенно с .attr() (в котором вполнеКлетчатое прошлое ) может быть очень уродливым.

О, и одна последняя ссылка: Джон Ресиг на jQuery 1.6 и .attr(). Прочитайте это.

0 голосов
/ 29 июля 2011

попробуйте сделать снимок:

var emptyInputsRound1 = $('input[value=""]');
$('#input2').attr("value",'hi2'); //notice change
var emptyInputsRound2 = $('input[value=""]');
$('#output').text(emptyInputsRound1.length + ', ' + emptyInputsRound2.length);

рабочий пример: http://jsfiddle.net/fSaQh/

...