¿Cómo se prueba la existencia de un elemento sin el uso del getElementById
método?
He configurado una demostración en vivo como referencia. También imprimiré el código aquí también:
<!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>
Básicamente, el código anterior demuestra que un elemento se almacena en una variable y luego se elimina del DOM. Aunque el elemento se ha eliminado del DOM, la variable conserva el elemento como estaba cuando se declaró por primera vez. En otras palabras, no es una referencia en vivo al elemento en sí, sino más bien una réplica. Como resultado, verificar la existencia del valor de la variable (el elemento) proporcionará un resultado inesperado.
La isNull
función es mi intento de verificar la existencia de elementos a partir de una variable, y funciona, pero me gustaría saber si hay una manera más fácil de lograr el mismo resultado.
PD: También me interesa saber por qué las variables de JavaScript se comportan así si alguien conoce algunos buenos artículos relacionados con el tema.
Respuestas:
Parece que algunas personas están aterrizando aquí, y simplemente quieren saber si un elemento existe (un poco diferente a la pregunta original).
Eso es tan simple como usar cualquiera de los métodos de selección del navegador y verificar que tenga un valor verdadero (generalmente).
Por ejemplo, si mi elemento tuviera un
id
de"find-me"
, simplemente podría usar ...Esto se especifica para devolver una referencia al elemento o
null
. Si debe tener un valor booleano, simplemente arroje un!!
antes de la llamada al método.Además, puede usar algunos de los muchos otros métodos que existen para encontrar elementos, como (todos viviendo fuera
document
):querySelector()
/ /querySelectorAll()
getElementsByClassName()
getElementsByName()
Algunos de estos métodos devuelven a
NodeList
, así que asegúrese de verificar sulength
propiedad, porque aNodeList
es un objeto y, por lo tanto, es verdadero .Para determinar realmente si un elemento existe como parte del DOM visible (como la pregunta que se hizo originalmente), Csuwldcat proporciona una mejor solución que la suya (como solía contener esta respuesta). Es decir, usar el
contains()
método en elementos DOM.Podrías usarlo así ...
fuente
var elementInDom = function( el ) { while ( el = el.parentNode ) if ( el === document ) return true; return false; }
getElementById()
que devolverá una referencia a un elemento DOM onull
, por lo tanto, usartypeof
(especialmente en el RHS) es incorrecto (si no se definiera, la condición LHS arrojaría unReferenceError
).document.body.contains()
que parece tener muy buena compatibilidad con el navegador?Utilizar
getElementById()
si está disponible.Además, aquí hay una manera fácil de hacerlo con jQuery:
Y si no puede usar bibliotecas de terceros, simplemente manténgase en JavaScript base:
fuente
$('#elementId')[0].length
no produciría el mismo resultado.if (element) {}
? Cuando el elemento no está definido o es nulo, esta expresión es falsa. Si el elemento es un elemento DOM, la expresión es verdadera.getElementById()
se especifica que devuelvanull
si no encuentra el elemento, por lo que solo se necesita verificar un valor devuelto verdadero .getElementById
Nunca debería volverundefined
. En cualquier caso, elelement != null
cheque recogería esto.Usando Node.contains DOM API , puede verificar la presencia de cualquier elemento en la página (actualmente en el DOM) con bastante facilidad:
NOTA DE NAVEGADOR CRUZADO : el
document
objeto en Internet Explorer no tiene uncontains()
método: para garantizar la compatibilidad entre navegadores, utilícelodocument.body.contains()
.fuente
document.contains()
debería ser suficiente.document.contains(document.documentElement)
.document
tieneNode
en su cadena de prototipos, por lo que puedo decir (document
->HTMLDocument
->Document
->Node
)document.body.contains([selector])
, es decirdocument.body.contains(document.getElementById('div')
Simplemente hago:
Funciona para mí y todavía no tuve problemas ...
fuente
id
. La mejor solución que responde a la pregunta ¿Cómo verificar si el elemento existe en el DOM visible? con cualquier elemento, incluso los elementos sinid
s son para hacerdocument.body.contains(element)
.contains()
Simplemente puede verificar si la propiedad parentNode es nula.
Es decir,
fuente
De la red de desarrolladores de Mozilla :
Esta función verifica si un elemento está en el cuerpo de la página. Como contiene () es inclusivo y determinar si el cuerpo contiene no es la intención de isInPage, este caso devuelve explícitamente falso.
nodo es el nodo que queremos verificar en el <cuerpo>.
fuente
false
sertrue
?node
IS esdocument.body
, seguramente el método debería volvertrue
? Es decir,return (node === document.body) || document.body.contains(node);
La solución más fácil es verificar la propiedad baseURI , que se establece solo cuando el elemento se inserta en el DOM, y se vuelve a una cadena vacía cuando se elimina.
fuente
Cannot read property 'baseURI' of null
. Ejemplo:console.log(document.querySelector('aside').baseURI)
Solución jQuery:
Esto funcionó para mí usando jQuery y no requirió
$('#elementId')[0]
ser utilizado.fuente
$('#elementId')[0]
que evitar algo?La solución de csuwldcat parece ser la mejor del grupo, pero se necesita una ligera modificación para que funcione correctamente con un elemento que está en un documento diferente al que se está ejecutando el código JavaScript, como un iframe:
Tenga en cuenta el uso de la
ownerDocument
propiedad del elemento , en lugar de simplemente viejodocument
(que puede o no hacer referencia al documento del propietario del elemento).torazaburo publicó un método aún más simple que también funciona con elementos no locales, pero desafortunadamente, utiliza la
baseURI
propiedad, que no está implementada de manera uniforme en todos los navegadores en este momento (solo pude hacer que funcione en los basados en WebKit ). No pude encontrar ninguna otra propiedad de elemento o nodo que pudiera usarse de manera similar, por lo que creo que por el momento la solución anterior es tan buena como parece.fuente
En lugar de iterar padres, solo puede obtener el rectángulo delimitador que es todo ceros cuando el elemento se separa del DOM:
Si desea manejar el caso de borde de un elemento de ancho y altura cero en la parte superior cero y cero izquierda, puede verificar dos veces iterando los padres hasta que
document.body
:fuente
Una forma simple de verificar si existe un elemento puede hacerse a través del código de una línea de jQuery.
Aquí está el código a continuación:
fuente
Otra opción es element.closest :
fuente
Este código funciona para mí y no tuve ningún problema con él.
fuente
También puede usar
jQuery.contains
, que comprueba si un elemento es descendiente de otro elemento. Pasédocument
como elemento principal para buscar porque cualquier elemento que exista en la página DOM es descendiente dedocument
.fuente
Compruebe si el elemento es hijo de
<html>
viaNode::contains()
:He cubierto esto y más en is-dom-detached .
fuente
Una solución simple con jQuery:
fuente
$(document).find(yourElement).length !== 0
null == undefined
. El valor real devuelto seríaundefined
. Compararlonull
es un poco extraño.fuente
DOM
, sus padres también deben estar endocument
Entonces, para verificar que simplemente recorramos los elementos
parentNode
árbol hasta llegar al último abueloUtilizar este:
fuente
Me gustó este enfoque:
también
fuente
!!
si quieres un booleano?Utilizar
querySelectorAll
conforEach
,como lo contrario de:
fuente
Intenta lo siguiente. Es la solución más confiable:
Por ejemplo,
fuente
¡Todos los elementos existentes tienen conjunto parentElement, excepto el elemento HTML!
fuente
Esta condición de pollito todos los casos.
fuente
Prefiero usar la
node.isConnected
propiedad ( Visita MDN ).Nota: Esto volverá verdadero si el elemento también se agrega a ShadowRoot, lo que podría no ser el comportamiento deseado por todos.
Ejemplo:
fuente