jQuery каждый - объединение (это) со спецификацией класса

Я пытаюсь перебрать некоторые строки таблицы. Упрощенные строки следующие:

<table>
  <tr id="ucf48">
    <td class="ucf_text">
      <input name="ucf_t48" value="Ann becomes very involved in the text she is reading." type="text">
    </td>
  </tr>
  <tr id="ucf351">
    <td class="ucf_text">
      <input name="ucf_t351" value="Ann is a fast and confident reader." type="text">
    </td>
  </tr>
</table>

Я использую этот код для цикла:

$('#ucf tr').each(function(i,obj){
    var cn=$(this).attr('id').substr(3);
    var t=$(this +'.ucf_text input').val();

    console.log("Row "+i);
    console.log("Cnum: "+cn);
    console.log(t);
});

Консольный вывод:

Row 0
Cnum: 48
Ann becomes very involved in the text she is reading.
Row 1
Cnum: 351
Ann becomes very involved in the text she is reading.

Теперь, прежде чем кто-то разозлит меня, я знаю, что могу сделать это по-другому, ссылаясь на данные, которые я хочу, используя "имя". Почему, однако, моя переменная cnum следует 'this', а переменная t - нет?

Благодарю.

5 ответов

Решение

Когда вы делаете:

var t=$(this +'.ucf_text input').val();

this неправильно конвертируется в строку.

Пытаться:

var t=$(this).find('.ucf_text input').val();

Вы не можете объединять объекты и строки DOM.

Вы можете легко исправить это, указав this в качестве контекста селектора:

var t = $('.ucf_text input', this).val();

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

var t=$(this +'.ucf_text input').val();

Вы пытаетесь объединить строку с узлом DOM. Я полагаю, вы хотите детей из каждого ряда? Который будет:
var t=$(this).find('.ucf_text input').val();

У вас уже есть 2 правильных ответа, но просто ради разнообразия вот еще один способ сделать это:

var t = $('.ucf_text input', this).val();

На самом деле это потому, что $(this) [tr] не имеет класса .ucf_text

Я думаю, что вы имели в виду тд под этим

Добавьте пробел, чтобы показать, что вы имеете в виду ребенка.:)

var t=$(this +' .ucf_text input').val();
               ^ Space!

РЕДАКТИРОВАТЬ: Или нет!

var t=$(this).children('.ucf_text').children('input').val();

Find намного круче, но я редактирую, чтобы не оставить неправильный ответ, и хотел быть несколько оригинальным, и, кроме того... Может быть, вам нужен четкий путь для ввода?

Другие вопросы по тегам