Выбор по элементу ID + класс элемента дает один и тот же элемент дважды
Почему jQuery возвращает один и тот же элемент дважды здесь?
Проверял HTML много раз, там только один <div>
с id="3"
и class="password_field_real"
.
Это результат получения всех элементов с помощью class="password_field_real"
:
> $(".password_field_real")
[
<div class="password_field_real" id="2" style="display: none;"></div>,
<div class="password_field_real" id="3" style="display: none;"></div>,
<div class="password_field_real" id="7" style="display: none;"></div>,
]
Однако, когда я пытаюсь получить class="password_field_real"
и id="3"
, я получаю список из двух div, которые являются одинаковыми!
> $("#3.password_field_real")
[
<div class="password_field_real" id="3" style="display: none;"></div>,
<div class="password_field_real" id="3" style="display: none;"></div>
]
Это не относится к двум другим div:
> $("#7.password_field_real")
[
<div class="password_field_real" id="7" style="display: none;"></div>
]
Почему это может случиться?
* ОБНОВЛЕНИЕ *
Воспроизводится в jsFiddle
* ОБНОВЛЕНИЕ # 2 *
Если используется нечисловой идентификатор, все отлично работает.
Ответы
Ответ 1
Прежде всего, id
должен быть уникальным на странице. Это и есть идея.
Ваша проблема в том, что вы используете недопустимый селектор ID (в соответствии с HTML4):
- Идентификаторы ID и NAME должны начинаться с буквы ([A-Za-z]) и могут быть за которым следует любое количество букв, цифр ([0-9]), дефис ( "-" ), подчеркивания ( "_" ), двоеточия ( ":" ) и периоды ( "." ).
В других доктринах существуют разные ограничения, но вам всегда нужна хотя бы одна буква. Поскольку вы используете только номер, он недействителен. Это может быть объяснением, когда вы используете нечисловой идентификатор все в порядке. Тем не менее это немного странное поведение jQuery.
Подтвердите свой идентификатор хотя бы одной буквой [A-Za-z]
, или даже лучше, сделайте ее описательной.
Ответ 2
НИКОГДА не используйте несколько раз один и тот же идентификатор, id ДОЛЖЕН быть УНИКАЛЬНЫМ
alert( $("#3").length ); // will just return 1 not 8
этот действительно тупой код просто выберите ваш хороший, но никогда не используйте его, вызовет конец света
alert( $("#3").find("#3").filter(".password_field_real").attr("class") );
если вам нужен текущий идентификатор для каждого под "div" и "a", попробуйте данные - почему бы не использовать такой код
$(".password_entry").each(function(){
var $t = $(this);
var currentId = $t.attr("id");
$t.find("div,a").data("id",currentId);
});
теперь вы можете извлечь текущий идентификатор из всех под "div" и "a" с .data( "id" )
например:
$(".password_field_mask").click(function(){ alert( $(this).data("id") ); });