jQuery — получить следующий элемент с тем же именем, что и идентификатор выбранного ввода

#jquery #jquery-selectors

#jquery #jquery-селекторы

Вопрос:

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

В настоящее время я использую jQuery скрипт, который проверяет, на blur на input:text , что текстовое значение ввода больше определенного значения. Если нет, ввод будет выделен красным цветом, но то, что я хотел бы сделать дальше, — это иметь a <p> в соседнем столбце, чтобы изменить его текст.

Мой HTML выглядит так:

 <tr>
      <td width="15%"><label for="example">Hello world</label></td>
      <td width="70%"><input type="text" class="" id="example" value=""/></td>
      <td width="15%"><p name="example"></p></td>
 </tr>
  

И мой jQuery / css :

 <style type="text/css">
    .fail{
        border:2px red solid;
    }   
    </style>

    <script type="text/javascript">
    /* Inline, onBlur validation 
    Text */
    $('input:text').blur(function() {
        if ($(this).val().length <= 2) {
            $(this).attr('class', 'fail');
            }else{$(this).attr('class', '');}
    });
    </script>
  

Возможно blur ли каким-то образом вызвать следующий элемент с тем name же именем, что и у выбранного ввода id , а затем изменить его текст? Я знаю, что это должна быть сложная динамическая головоломка для решения, но это то, что мне действительно нужно.

В прошлом я добивался того же эффекта, повторяя код для каждого элемента, но здесь это не совсем подходит.

Спасибо за любой совет, который вы можете мне дать!

Ответ №1:

zzzzBov верен, однако было бы лучше использовать контекст для повышения эффективности и / или имя тега. Кроме того, добавьте переменную, которая ссылается на $(this).

 var $this = $(this);
$('p[name="' $this.attr('id') '"]', $this.closest('tr')).text('foo bar baz'); 
  

Отредактировано после комментария
Разница между приведенным выше ответом и ответом zzzzBov заключается в:

 $('[name="' $(this).attr('id') '"]')  
// will start traversing the DOM starting at the beginning of the 
// document. Largest search.

$('p[name="' $this.attr('id') '"]')
// will first call getElementsByTagName and try to find a match, smaller search.

$('p[name="' $this.attr('id') '"]', $this.closest('tr'))
// will only search the contents of the closest('tr') tag 
// that is an ancestor of your input. Even smaller search.
  

Вообще говоря, более конкретная работа с селекторами jQuery может улучшить производительность. Кроме того, использование переменной для хранения выбранных элементов, таких как var $this = $(this); или var $myElement = $('#myElement') , более эффективно, чем создание одних и тех же селекторов снова и снова. Помните, что jQuery настолько эффективен, насколько это возможно с селекторами, но вы должны использовать их в своих возможностях.

Комментарии:

1. John Hartsock как это будет отличаться от @zzzzBov при использовании parent ? Я все еще новичок jQuery , так что простите мое невежество…

2. Ах, спасибо, Джон, я попробую это сейчас… Я даже не думал о такой эффективности. Спасибо! В свете вашей дополнительной помощи я поставил вам галочку — спасибо за вашу помощь!

3. $(foo, bar) эквивалентно $(bar).find(foo)

4. Кроме того, хотя я полностью согласен с использованием контекста, не оптимизируйте преждевременно

Ответ №2:

В контексте обратного blur вызова:

 $('[name="' $(this).attr('id') '"]').text('foo bar baz');
  

Комментарии:

1. Это отлично работает для меня, большое вам спасибо! Из интереса, этот фрагмент должен работать, чтобы изменить все остальные атрибуты, верно? Как в, если используется $('[name="' $(this).attr('id') '"]').attr('class', 'fail-text'); …?

2. вы хотите использовать addClass функцию для добавления класса в узел dom.