Сжатие двух дочерних вызовов () в один

#jquery #select #jquery-selectors #children

#jquery #выберите #jquery-селекторы #дочерние вызовы

Вопрос:

Как мне превратить это, которое использует два вызова two children :

 $('#id tr').children('td').children('input')
  

во что-то, что вызывает дочерние вызовы только один раз? Я пытаюсь выделить каждое текстовое поле ввода внутри определенной строки таблицы ( tr ), которая является дочерней для #id . Я пытался

 $('#id tr').children('td input')
  

и

 $('#id tr').children('td > input')
  

Но ни то, ни другое не работает. Я вроде как новичок в этих выражениях селектора, так что извините, если это очевидно.

Ответ №1:

Хотя мне нравятся $("#id tr td input") предложения, в некоторых случаях (например, если у вас был $("#id tr") объект из какого-либо другого источника) вы могли бы вместо этого искать .find() , который проходит на несколько уровней глубже (вместо .children() которого проходит только один):

 $("#id tr").find("td input")
  

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

1. проверьте мой ответ, который в основном позволяет вам использовать селектор из другого источника.

2. @kuroir, да, если у вас есть селектор вместо объекта, вы также можете использовать $("x", "y") синтаксис. Хотя — не то чтобы это действительно имело значение — некоторые тесты, которые я видел, показывают, что $("x", "y") они медленнее, чем $("y").find("x") . Я нахожу это хуже, потому что это менее явно.

3. сработало как по волшебству. Что приятно, так это то, что find происходит на несколько уровней глубже, о чем я не знал до прочтения этого ответа, и из-за этого я могу просто уменьшить его до $('#id').find('input'); Еще раз спасибо, 1 и проверить.

Ответ №2:

Почему бы просто не $('#id tr input') ?

Или, может быть $('#id input')

Ответ №3:

Я поражен, что никто не предложил это:

 $('td input', '#idc tr')
  

Что позволит вам получить #idc tr часть из переменной. По сути, то, что вы делаете, — это конкатенация; таким образом, вы сначала считываете правый селектор, а затем левый, например:

 $('> input', 'div')
  

Эквивалентно:

 $('div > input')
  

Теперь давайте немного поиграем в гольф; способ передачи селектора можно упростить до этих двух форм:

 $('input', '#idc td')
// vs
$('#id').find('td input')
  

Оба в основном выполняют одно и то же, однако, как вы, возможно, заметили, второй позволяет вам выполнять объединение jquery в цепочку; используя .end() для возврата к предыдущему селектору #id .

Обычно я использую первый оператор всякий раз, когда мне нужно сделать что-то простое, что не требует от меня возврата к предыдущему селектору.

Ответ №4:

Вы можете установить класс для своих входных данных и выбрать его

$('#id tr').children('td:input').hasclass('class name')

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

1. Это не только не сработает, потому что td:input недопустимый синтаксис, это также не сработает, потому что hasClass (не hasclass ) возвращает логическое значение вместо объекта jQuery.