sábado, 25 de mayo de 2013

JavaScript: Cómo comprobar si un elemento existe en el DOM

Es muy común tener que comprobar si un elemento HTML existe en el documento que estamos manejando. Vamos a ver a continuación dos formas de hacerlo, una con JavaScript puro y la otra utilizando jQuery.

Vamos a suponer que el elemento en cuestión tiene una id que para nuestro ejemplo será elementID.

JavaScript puro

En JavaScript podemos utilizar document.getElementById:


if ( document.getElementById( "elementID" )) {
      //...
}

En realidad estamos intentando seleccionar el elemento con id="elementID". Si el elemento existe, document.getElementById() lo devuelve ( es un elemento del DOM y equivale a true ). Si no existe devuelve null que equivale a false.

Usando jQuery

En jQuery no nos basta con intentar simplemente seleccionar el elemento:


// esto no funciona!!
if ( $("#elementID") ) {
      //...
}

No funciona porque jQuery siempre devuelve un array de elementos, aunque sólo haya uno o incluso aunque no haya ninguno. Si el elemento no existe devolverá un array vacío, que equivale a true. Por lo tanto tenemos que comprobar el número de elementos devueltos:


if ( $("#elementID").length ) {
     //...
}

Cuando el array está vacio $("#elementID").length es 0 y por lo tanto false, para cualquier otro número será true.

14 comentarios:

  1. Gracias!!!, Me sirvió de mucho ;)

    ResponderEliminar
  2. Lógica Basica como no se me ocurrio. muchas gracias!!!

    ResponderEliminar
  3. Genial, mejor explicado imposible! :) Gran aporte.

    ResponderEliminar
  4. También me gustaría agregar unas funciones adicionales, con el permiso de uds. Las mismas son para agregar, eliminar y verificar la existencia de un elemento, según su id. Allí se las dejo:
    function crearElemento(){
    if(!existeElementoHTML("nuevoElemento")){
    var a = document.createElement("p");
    a.innerHTML = "NUEVO ELEMENTO CREADO POR JS.";
    a.setAttribute("id", "nuevoElemento");

    var CAPA = document.getElementById('miCapa');
    CAPA.appendChild(a);
    }
    }

    function eliminarElemento(idElemento){
    if(existeElementoHTML(idElemento)){
    var elemento = document.getElementById(idElemento);
    elemento.parentNode.removeChild(elemento);
    }else{
    alert("No existe el elemento "+idElemento);
    }
    }

    function existeElementoHTML(idElemento){
    var salida = false;
    if(document.getElementById(idElemento)){
    salida = true;
    }
    return salida;
    }

    function validaExiste(idElemento){
    if(existeElementoHTML(idElemento)){
    alert("E X I S T E ! ! . . ;-)");
    }else{
    alert("N O E X I S T E ! ! . :-(");
    }
    }

    ResponderEliminar
  5. Muy útil y fácil, muchas gracias.

    ResponderEliminar
  6. Pabl.o no tubo la ocurrencia de colocar un ejemplo de verdad, que sea entendible, sin embargo José Delgado que es un participante como nosotros hizo lo que hacia falta verdaderamente,... un ejemplo.
    Asi son las diferencias individuales.

    ResponderEliminar
  7. Alguien tiene idea porque tengo este error: Describo la situación; en el código chequeo si existe el formulario, si existe cargo el objeto,

    if ( $("#frmLogin").length ) {
    console.log('existe');
    const inputs = document.querySelectorAll('#frmLogin input');
    alert('cargando en linea ...:'+inputs);
    }

    pero cuando voy leer el objeto mas abajo, da error

    inputs.forEach((input) => {
    input.addEventListener('keyup', validarFrmLogin);
    }

    SIN ERROR AL COMENTAR EL IF:
    Si directamente no chequeo con el If (lo comento)
    //if ( $("#frmLogin").length ) {
    console.log('existe');
    const inputs = document.querySelectorAll('#frmLogin input');
    alert('cargando en linea 12:'+inputs);
    //}

    Cargo sin problemas el objeto:
    inputs.forEach((input) => {
    input.addEventListener('keyup', validarFrmLogin);
    }
    Mi consulta:
    Como poder cargar desde un mismo archivo.js, distintos formularios, en función de la página que visito.

    Mi solución, (no me parece funcional)
    Crear un archivo.js para cada página que visito y directamente ya no compruebo con If la existencia del elemento.

    Esta solución no me parece la apropiada, humildemente hay algo que estoy haciendo mal.

    ResponderEliminar