Причина, по которой все предыдущие ответы требуют параметр .length
, заключается в том, что они в основном используют селектор jquery $()
, у которого querySelectorAll находится за занавесом (или они используют его напрямую). Этот метод довольно медленный, потому что ему нужно проанализировать все дерево DOM, отыскивая все совпадения с этим селектором и заполняя им массив.
Параметр ['length'] не нужен и не полезен, и код будет намного быстрее, если вместо этого напрямую использовать document.querySelector(selector)
, поскольку он возвращает первый соответствующий элемент или ноль, если не найден.
function elementIfExists(selector){ //named this way on purpose, see below
return document.querySelector(selector);
}
/* usage: */
var myelement = elementIfExists("#myid") || myfallbackelement;
Однако этот метод оставляет нас с фактическим возвращаемым объектом; это нормально, если он не будет сохранен как переменная и использован повторно (таким образом, сохраняя ссылку, если мы забудем).
var myel=elementIfExists("#myid");
// now we are using a reference to the element which will linger after removal
myel.getParentNode.removeChild(myel);
console.log(elementIfExists("#myid")); /* null */
console.log(myel); /* giant table lingering around detached from document */
myel=null; /* now it can be garbage collected */
В некоторых случаях это может быть желательно. Его можно использовать в цикле for следующим образом:
/* locally scoped myel gets garbage collected even with the break; */
for (var myel; myel = elementIfExist(sel); myel.getParentNode.removeChild(myel))
if (myel == myblacklistedel) break;
Если вам на самом деле не нужен элемент и вы хотите получить / сохранить только значение true / false, просто удвойте его! Это работает для обуви, которая развязана, так зачем сюда завязывать узлы?
function elementExists(selector){
return !!document.querySelector(selector);
}
/* usage: */
var hastables = elementExists("table"); /* will be true or false */
if (hastables){
/* insert css style sheet for our pretty tables */
}
setTimeOut(function (){if (hastables && !elementExists("#mytablecss"))
alert("bad table layouts");},3000);