Сложность Javascript DOM

#javascript #jquery #dom #html-table

#javascript #jquery #dom #html-таблица

Вопрос:

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

Вот сводный код:

 $( "#listitems tbody" ).append( "<tr onclick="editListItem(this)">"  
        "<td>"   id.val()   "</td>"    
        "<td>"   title.val()   "</td>"   
        "<td>"   description.val()   "</td>"   
        "<td>"   TF   "</td>"   
        "<td style="visibility: hidden;">"   id.val()   "</td>"   
"</tr>" );
  

Как вы можете видеть, я задаю содержимое строки и ячеек этой таблицы динамически. Однако мне нужно передать ссылку на эту строку таблицы в ее функцию onClick, которая вызывает этот метод Javascript:

 function editListItem(obj) {
    var id = obj.cells[4].innerHTML;
    var cells = document.getElementById('listitems').rows[id].cells;
    DATA[0] = cells[0].innerHTML;
    DATA[1] = cells[1].innerHTML;
    DATA[2] = cells[2].innerHTML;
    DATA[3] = cells[3].innerHTML;
}
  

В этом методе мне нужно получить доступ к значению, содержащемуся внутри 4-й «скрытой» ячейки строки таблицы, на которую был сделан щелчок. Обычно я бы просто передал переменную ID в метод onClick, но содержимое этой таблицы можно сортировать и переставлять, поэтому переменная ID не обязательно будет соответствовать содержимому строки.

Я гуглил последние четыре часа, но не могу найти никаких конкретных примеров для этой ситуации; все, что я пробовал, просто вызывает ошибку Javascript, объявляющую, что obj.cells, obj[4], obj.childNodes и т.д. Не существуют, В зависимости от того, какой из них я пытаюсь.

Кто-нибудь знает, как вы можете получить доступ к innerHTML элементам ячейки таблицы внутри элемента строки таблицы, передав «this» в onClick строки таблицы?

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

Ответ №1:

как насчет:

 $( "#listitems tbody" ).append(
    $('<tr>....</tr>')
        .bind('click', function(){
            var tds = $(this).find('td'),
                 id = tds.eq(4).text();
        })
);
  

И если это не то, что вы имели в виду, дайте мне знать. Я не уверен на 100%, что понимаю, о чем вы просите 🙂

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

1. Я понимаю, что вы имеете в виду, но я не знаю, какой синтаксис использовать, чтобы фактически ссылаться на подэлементы строки; Я полагаю, что использование bind — это то же самое, что передача «this» в метод onClick, поправьте меня, если я ошибаюсь. Аналогично, если «this» — строка таблицы, как мне на самом деле ссылаться на ее ячейки? похоже, что ни this.cells, ни this.childNodes, ни прямое использование этого[#] не работают.

Ответ №2:

Судя по вашему коду, вы используете jQuery, поэтому вы можете легко получить 5-й td, используя

 $(this).children('td').eq(4)
  

а затем делайте с этим элементом jQuery все, что хотите

проверьте селектор эквалайзера jQuery для получения дополнительной информации

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

1. Вы, сэр, джентльмен и ученый, хотя вместо «этого» мне пришлось использовать переданный мной параметр «obj», поскольку простой встроенный onClick не регистрирует должным образом владение функцией, это всего лишь вызов функции. Мне пришлось передать ссылку «this» в обработчик событий и получить к ней доступ через $ (obj) вместо неявного использования $ (this). Спасибо! 🙂

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

Ответ №3:

Сначала создайте свой <tr> элемент самостоятельно и используйте надлежащий JS для регистрации обработчика, а не встраивания обработчика в атрибуты элемента:

 var tr = $('<tr>').click(editListItem);
$("#listitems tbody").append(tr);
$(tr).append( ... );
  

В editListItem , this будет автоматически применяться ко всему элементу строки:

 function editListItem(row) {
    var cells = $(this).children('td');
    var id = $cells.eq(4).text();
    var data = [];
    data[0] = cells.eq(0).html();
}
  

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

1. Закрыть, хотя я не понимаю, почему регистрация обработчика имеет какое-либо значение по сравнению с внедрением обработчика; ссылка «this» все равно должна применяться в обоих случаях, пока строка таблицы владеет обработчиком событий, верно? В любом случае, я столкнулся с некоторыми проблемами с вашим решением, но спасибо за помощь! 🙂