// I wonder if "parent().parent()" would be faster
// (and still safe for use if "thead" is omitted)?
Нет.Если <thead>
опущен, то в HTML будет автоматически добавлен элемент <tbody>
, потому что в HTML4 и начальный тег, и конечный тег являются необязательными.Таким образом, в HTML это будет parent().parent().parent()
, но в XHTML-serve-as-XML, в котором нет глупостей, являющихся необязательными тегами, это будет parent().parent()
.
Вероятно, лучшепридерживаться closest()
.Это более понятно, это не особенно медленно, и вы используете его только один раз, так что в любом случае это не критично.
index = cell.index();
Хотя, опять же, это только один раз на таблицу, поэтому не критично, стандартное свойство DOM для непосредственного получения индекса ячейки таблицы, что будет быстрее, чем запросить jQuery для поиска и подсчета предыдущих братьев и сестер: index= cell[0].cellIndex
.
// we have to insert the "dummy" div so we know
// where to put the table back after the loop.
Это немного уродливо.Стандартный DOM имеет лучший ответ на этот вопрос: помните parentNode
и nextSibling
элемента (которые могут быть null
, если это последний брат или сестра), и когда вы закончите, вы можете parent.insertBefore(table, sibling)
.
.children("tbody")
.children()
.children(":eq(" + index + ") :checkbox")
.each(function () {
this.checked = isChecked;
});
Вы должны рассмотреть возможность использования .children().eq(index)
вместо того, чтобы скрывать это в селекторе.Разница не будет большая , но она немного понятнее.
В любом случае, вы можете сохранить движок селектора jQuery, используя более стандартный DOM для обхода таблицы.:
$.each(table[0].tBodies[0].rows, function() {
$(this.cells[index]).find('input[type=checkbox]').each(function() {
this.checked = isChecked;
});
});
Селекторные запросы могут быть быстрыми, если они работают с документом и используют только стандартные CSS-селекторы.В этом случае jQuery может передать работу на быстрый метод браузера document.querySelectorAll
.Но селекторы с областью действия (find
и второй аргумент к $()
) не могут быть оптимизированы из-за разногласий между jQuery и Selectors-API относительно их значения и нестандартных селекторов Sizzle, таких как :eq
и :checkbox
будет просто отклонено.Итак, это:
$('#tableid>tbody>tr>td:nth-child('+(index+1)+') input[type=checkbox]')
может быть на самом деле быстрее, в современных браузерах с querySelectorAll
!