2013-10-05 2 views
4

Обновление Я предполагаю, что я должен был быстро принять загадку jQuery voodoo. Я заметил, что дважды использую идентификатор «username», и это проблема. второй идентификатор имени пользователя был добавлен на страницу через html-код, который был введен на страницу с php, поэтому я не мог увидеть его в исходном файле сначала.

Я пишу этот код подтверждения jQuery для вашей стороны:

username = $("#username").val(); 

if (username.length < 5 || username.length > 15 || !username_regex.test(username)) { 
       error += "invalid username\n"; 
       $(this).find("label[for='username']").css("color", "red"); 
       $("#username").css("background-color", "#ffc9c9").css("border-color", "red"); //this doesn't work 
       // $("input[id='username']").css("background-color", "#ffc9c9").css("border-color", "red"); //this works 
      } 

и HTML:

<p><label for="username">Username</label><input id="username" type="text" name="username"/></p> 

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

это код проверки является частью обработчика onsubmit, и все остальные блоки работают нормально: когда поле не соответствует критериям проверки, цвет его метки становится красным, а цвет фона его поля ввода превращается в # ffc9c9.

проблема в имени пользователя - это ярлык становится красным, но поле ввода не поворачивается # ffc9c9. Я не вижу никаких оснований для того, чтобы не работать, я использую ту же линию:

$("#*input_field_id*").css("background-color", "#ffc9c9").css("border-color", "red"); 

для каждого из других блоков и она отлично работает для них.

также видит, что закомментированная линия:

$("input[id='username']").css("background-color", "#ffc9c9").css("border-color", "red"); 

делает работу и решает мою потребность. но это не решает загадки, и я пытаюсь понять, почему не работает эта линия. также заметить, что я отлажена с поджигатель и получили ожидаемые результаты, например:

$("#username").attr("name"); // = username, as expected 

Она сводится к следующему: почему $("input[id='username']") работает, когда я пытаюсь изменить это CSS, но $("#username") не будет?

+1

у вас нет дублирующихся идентификаторов в вашем HTML ? – lukaleli

+0

И чего вы пытаетесь достичь этим: $ (this) .find ("label [for = 'username']").css («цвет», «красный»); ? на что это указывает? – lukaleli

+0

@ jimmyweb У меня этот идентификатор только один раз. и указанная вами линия указывает на метку имени пользователя и рисует ее красным – Ziv

ответ

3

Это потому, что идентификаторы должны быть уникальными, а идентификатор селектора выбирает только первый элемент с определенным идентификатором, вместо этого вы должны использовать классы. Вы получите тот же результат, используя метод .getElementById() объекта document, это ожидаемое поведение. Селекторы атрибутов работают по-другому.

+1

. Я пришел сюда, чтобы сказать то же самое, почти так же, как мы равны. – andlrc

+0

Это поле уникально, и я использую id = «имя пользователя» только в этом поле ввода, которое я упомянул в html выше – Ziv

+0

@Ziv Что означает '$ (" [id = 'username'] "). length' return? – undefined

0

Попробуйте, как показано ниже:

$("#username").css({'background-color': "#ffc9c9",'border-color': "red"}); 
0

Это jsfiddle показывает #username работает. Но мне пришлось удалить вашу строку, которая присваивает значение ошибке, поскольку она, похоже, терпит неудачу.

Код:

if (username.length < 5 || username.length > 15 || !username_regex.test(username)) { 
    $(this).find("label[for='username']").css("color", "red"); 
    $("#username").css("background-color", "#ffc9c9").css("border-color", "red"); 
} 

ДОБАВЛЕНО:

Если вы intialise вашей строки ошибки перед, если блок, он работает:

username = 'aaa'; 
error = ''; 
if (username.length < 5 || username.length > 15 || !username_regex.test(username)) { 
    error += "invalid username\n"; 
    $(this).find("label[for='username']").css("color", "red"); 
    $("#username").css("background-color", "#ffc9c9").css("border-color", "red"); 
} 
+0

@ «Фрэнк Фахардо» Я инициализировал поле «ошибка», я не добавил к фрагменту здесь, поскольку я думал, что это довольно очевидно и не имеет отношения к проблеме, с которой я столкнулся – Ziv

+0

Вы пытались запустить свой скрипт при отладке? Ваш код, безусловно, работает, если я только инициализирую ошибку перед блоком if. Так что это может быть работа над вашим кодом под отладки. Иногда очевидные не слишком очевидны. –

+0

Я пробовал его при отладке, а при запросе $ («# username») для нескольких вещей (имя, атрибут css, ...) он возвращает ожидаемые результаты – Ziv

Смежные вопросы