JSPerf всех методов на этой странице
Отредактировано: Причина того, что мой первоначальный метод работает быстрее, заключается в том, что он использовал .find('>' + selector)
, где нужно использовать .children()
(который перебирает все дочерние элементы и проверяет, соответствует ли элемент селектору).
Поскольку div
— это нативно поддерживаемый селектор, а тестовый пример не содержит глубоко вложенных элементов, мое решение оказалось быстрым. Но после его нормализации он выглядит почти таким же, как решение qwertymks. JSPerf этих двух решений покажет, что его решение немного быстрее, потому что оно имеет на один вызов функции меньше.
Решения на этой странице являются общими: приведенный ниже код можно оптимизировать для конкретных случаев (например, тот факт, что селектор — это просто тег): http://jsfiddle.net/kFZJs/
Чтобы ускорить процесс, разделите селектор, потому что :visible
не является родным селектором CSS.
Предпочтительное решение должно использовать как можно меньше jQuery, потому что желаемое решение должно быть производительным. Для этого изучите логику :visible
.
Исходная функция содержит jQuery.support.reliableHiddenOffsets
. Это можно безопасно убрать в пользу производительности, когда ваши дочерние элементы не являются ячейками таблицы (что используется только в IE8-).
Теперь напишите плагин jQuery (это не дорого):
(function($) {
$.fn.hasAtLeastOneVisibleChild = function(selector) {
var $col = this.children(selector), i, elem;
for (i=0; i<$col.length; i++) {
var elem = $col[i];
if (elem.offsetWidth !== 0 || elem.offsetHeight !== 0) {
return true;
}
}
return false;
};
})(jQuery);
// Usage:
$this.hasAtLeastOneVisibleChild('div'); // True or false
person
Rob W
schedule
10.07.2012