Как узнать, отображается ли элемент DOM?

Не следует путать с "Как узнать, виден ли элемент DOM?"

Я хочу определить, отображается ли данный элемент DOM на странице. Например. если элемент является дочерним по отношению к родительскому элементу, для которого установлен display:none;, он не будет виден.

(Это не имеет никакого отношения к тому, находится ли элемент в области просмотра или нет)

Я мог бы перебрать каждый родительский элемент, проверяя стиль display, но я хотел бы знать, есть ли более прямой способ?

Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
8
0
8 183
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Из быстрого теста в Firefox, похоже, что все свойства размера и положения (clientWidth, offsetTop и т. д.) Возвращают 0, когда элемент скрыт родительским элементом, являющимся display:none.

Хорошая идея. Даже указано: w3.org/TR/cssom-view/#offset-attributes

Kornel 03.12.2008 03:15

В текущем проекте модуля просмотра CSSOM (2013 г.) ссылка, размещенная @Kornel, больше не указывает на правый раздел. Проверьте w3.org/TR/cssom-view/#dom-htmlelement-offsettop.

falconepl 10.10.2015 21:15

Используя Прототип:

if ($('someDiv').visible) {...}

Было бы более полезно, если бы вы предоставили исходный код для этой функции Prototype, чтобы показать, как это можно сделать на самом деле.

Chris MacDonald 04.12.2008 18:47

Пользуюсь только библиотекой. Я этого не писал.

Diodeus - James MacFarlane 04.12.2008 20:48

Поскольку я использую MochiKit, на основе ответа Ant P я пришел к следующему:

getElementPosition('mydiv').y != 0

Я также могу проверить, находится ли он в области просмотра (по вертикали):

y = getElementPosition('mydiv').y
(y < getViewportPosition().y + getViewportDimensions().h &&
    getViewportPosition().y < y)

Кстати, это работает и в IE6.

Полагаться на позицию, равную 0, хрупко. Лучше написать вспомогательную функцию для перебора родителей, чтобы напрямую проверить их стиль отображения.

Хотите уточнить? Если он находится в стандарте, поддерживается группой, соответствующей стандартам (FF, WebKit,…), и поддерживается несовместимой гориллой, что делает его хрупким?

Ben Blank 13.01.2009 22:20

Вот итеративное решение -

var elementShown = function(e){
    if (e == document) 
      return true;

    if ($(e).css('display') == 'none') //or whatever your css function is
      return false;

    return elementShown(e.parentNode);
}

.getClientRects() вернет пустой массив, если элемент не отображается по наследству (display = "none" из родительского / предкового элемента)

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