jQuery каждый - объединение (это) со спецификацией класса - PullRequest
4 голосов
/ 31 марта 2012

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

<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 ]

8 голосов
/ 31 марта 2012

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

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

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

Попробуйте:

var t=$(this).find('.ucf_text input').val();
3 голосов
/ 31 марта 2012

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

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

3 голосов
/ 31 марта 2012

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

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

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

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

3 голосов
/ 31 марта 2012

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

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

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

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

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

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

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

3 голосов
/ 31 марта 2012

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

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

...