Как вы проверяете элемент на существование без использования getElementById
метода?
Я установил живую демонстрацию для справки. Я также напечатаю код здесь:
<!DOCTYPE html>
<html>
<head>
<script>
var getRandomID = function (size) {
var str = "",
i = 0,
chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
while (i < size) {
str += chars.substr(Math.floor(Math.random() * 62), 1);
i++;
}
return str;
},
isNull = function (element) {
var randomID = getRandomID(12),
savedID = (element.id)? element.id : null;
element.id = randomID;
var foundElm = document.getElementById(randomID);
element.removeAttribute('id');
if (savedID !== null) {
element.id = savedID;
}
return (foundElm) ? false : true;
};
window.onload = function () {
var image = document.getElementById("demo");
console.log('undefined', (typeof image === 'undefined') ? true : false); // false
console.log('null', (image === null) ? true : false); // false
console.log('find-by-id', isNull(image)); // false
image.parentNode.removeChild(image);
console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
console.log('null', (image === null) ? true : false); // false ~ should be true?
console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
};
</script>
</head>
<body>
<div id="demo"></div>
</body>
</html>
По сути, приведенный выше код демонстрирует, что элемент хранится в переменной, а затем удаляется из DOM. Несмотря на то, что элемент был удален из DOM, переменная сохраняет элемент таким, каким он был при первом объявлении. Другими словами, это не прямая ссылка на сам элемент, а точная копия. В результате проверка значения переменной (элемента) на наличие даст неожиданный результат.
Эта isNull
функция - моя попытка проверить существование элементов из переменной, и она работает, но я хотел бы знать, есть ли более простой способ добиться того же результата.
PS: мне также интересно, почему переменные JavaScript ведут себя так, если кто-то знает о некоторых хороших статьях, связанных с этой темой.
Ответы:
Кажется , что некоторые люди приземляются здесь, и просто хотят знать , если элемент существует (немного по- другому к исходному вопросу).
Это так же просто, как использовать любой из методов выбора браузера и проверить его на истинное значение (как правило).
Например, если бы у моего элемента был
id
of"find-me"
, я мог бы просто использовать ...Это указывается либо для возврата ссылки на элемент, либо
null
. Если вам нужно логическое значение, просто бросьте a!!
перед вызовом метода.Кроме того, вы можете использовать некоторые из многих других методов, которые существуют для поиска элементов, таких как (все живые
document
):querySelector()
/querySelectorAll()
getElementsByClassName()
getElementsByName()
Некоторые из этих методов возвращают a
NodeList
, поэтому обязательно проверьте егоlength
свойство, потому что aNodeList
является объектом и, следовательно, истинным .Для фактического определения, существует ли элемент как часть видимого DOM (как изначально заданный вопрос), Csuwldcat предоставляет лучшее решение, чем ваш собственный (как раньше содержал этот ответ). То есть, чтобы использовать в
contains()
метод по элементам DOM.Вы можете использовать это так ...
источник
var elementInDom = function( el ) { while ( el = el.parentNode ) if ( el === document ) return true; return false; }
getElementById()
будет возвращать ссылку на элемент DOM илиnull
, следовательно, использованиеtypeof
(особенно в RHS) является неправильным (если оно не было определено, условие LHS выдает aReferenceError
).document.body.contains()
которого, кажется, есть очень хорошая поддержка браузера?Используйте,
getElementById()
если это доступно.Кроме того, вот простой способ сделать это с помощью jQuery:
И если вы не можете использовать сторонние библиотеки, просто придерживайтесь базового JavaScript:
источник
$('#elementId')[0].length
не даст такой же результат.if (element) {}
? Когда элемент не определен или равен нулю, тогда это выражение ложно. Если элемент является элементом DOM, то выражение является истинным.getElementById()
is spec'd для возврата,null
если элемент не найден , поэтому проверка на истинное возвращаемое значение - это все, что нужно.getElementById
никогда не должен возвращатьсяundefined
. В любом случае,element != null
чек подхватит это.Используя Node.contains DOM API , вы можете легко проверить наличие любого элемента на странице (в настоящее время в DOM):
ПРИМЕЧАНИЕ : у
document
объекта в Internet Explorer нетcontains()
метода - для обеспечения кросс-браузерной совместимости используйтеdocument.body.contains()
вместо этого.источник
document.contains()
.document.contains(document.documentElement)
.document
действительно имеетNode
на своей цепочке прототипов, насколько я могу сказать (document
->HTMLDocument
->Document
->Node
)document.body.contains([selector])
, то естьdocument.body.contains(document.getElementById('div')
Я просто делаю:
Это работает для меня и не было проблем с этим еще ...
источник
id
. Лучшее решение, которое отвечает на вопрос Как проверить, существует ли элемент в видимом DOM? с любым элементом, даже с элементами безid
sdocument.body.contains(element)
.contains()
Вы можете просто проверить, является ли свойство parentNode нулевым.
Это,
источник
Из Сети разработчиков Mozilla :
Эта функция проверяет, находится ли элемент в теле страницы. Так как метод Вектор () является включающим, и определение того, содержит ли тело себя, не предназначено для isInPage, в этом случае явно возвращается значение false.
узел - это узел, который мы хотим проверить в <теле>.
источник
false
бытьtrue
?node
ISdocument.body
, конечно, метод должен вернутьсяtrue
?return (node === document.body) || document.body.contains(node);
Самым простым решением является проверка свойства baseURI , которое устанавливается только тогда, когда элемент вставлен в DOM, и при удалении оно возвращается к пустой строке.
источник
Cannot read property 'baseURI' of null
. Пример:console.log(document.querySelector('aside').baseURI)
Решение jQuery:
Это работало для меня с использованием jQuery и не требовало
$('#elementId')[0]
использования.источник
$('#elementId')[0]
чего-то следует избегать?Решение csuwldcat кажется лучшим из множества, но для его корректной работы необходимо внести небольшие изменения, чтобы элемент работал в другом документе, отличном от кода JavaScript, например, в iframe:
Обратите внимание на использование
ownerDocument
свойства элемента , в отличие от просто старогоdocument
(которое может относиться или не ссылаться на документ владельца элемента).torazaburo опубликовал еще более простой метод, который также работает с нелокальными элементами, но, к сожалению, он использует
baseURI
свойство, которое в настоящее время не одинаково реализовано во всех браузерах (я мог заставить его работать только в основанных на WebKit ). Я не смог найти никаких других элементов или свойств узла, которые могли бы быть использованы подобным образом, поэтому я думаю, что пока что вышеупомянутое решение настолько хорошо, насколько оно возможно.источник
Вместо того, чтобы перебирать родителей, вы можете просто получить ограничивающий прямоугольник, который является всеми нулями, когда элемент отсоединен от DOM:
Если вы хотите обработать крайний край нулевого элемента ширины и высоты с нулевой вершины и с нулевого левого угла, вы можете проверить дважды, перебирая родителей до
document.body
:источник
Простой способ проверить, существует ли элемент, можно сделать с помощью однострочного кода jQuery.
Вот код ниже:
источник
Другой вариант - element.closest :
источник
Этот код работает для меня, и у меня не было никаких проблем с ним.
источник
Вы также можете использовать
jQuery.contains
, который проверяет, является ли элемент потомком другого элемента. Я передал вdocument
качестве родительского элемента для поиска, потому что любые элементы, которые существуют на странице DOM, являются потомкамиdocument
.источник
Проверьте, является ли элемент дочерним
<html>
по отношению кNode::contains()
:Я рассказал об этом и многом другом .
источник
Простое решение с помощью jQuery:
источник
$(document).find(yourElement).length !== 0
null == undefined
. Реальное возвращаемое значение будетundefined
. Сравнение с этимnull
немного странно.источник
DOM
, его родители также должны быть вdocument
Таким образом, чтобы проверить, что мы просто зациклились на
parentNode
дереве элемента, пока не достигнем последнего дедаИспользовать этот:
источник
Мне понравился такой подход:
Также
источник
!!
если вы хотите логическое значение?Используйте
querySelectorAll
сforEach
,как противоположность:
источник
Попробуйте следующее. Это самое надежное решение:
Например,
источник
Все существующие элементы имеют установленный parentElement, кроме элемента HTML!
источник
это состояние цыплят во всех случаях.
источник
Я предпочитаю использовать
node.isConnected
собственность ( посещение MDN ).Примечание. Возвращается значение true, если элемент также добавляется в ShadowRoot, который может быть не всем желаемым пользователем.
Пример:
источник