jQuery: comprueba si existe div con cierto nombre de clase


235

Usando jQuery estoy generando programáticamente un montón de div 's como este:

<div class="mydivclass" id="myid1">Some Text1</div>
<div class="mydivclass" id="myid2">Some Text2</div>

En otro lugar de mi código necesito detectar si existen estos DIV. El nombre de la clase para los divs es el mismo, pero la ID cambia para cada div. ¿Alguna idea de cómo detectarlos usando jQuery?

Respuestas:


424

Puede simplificar esto marcando el primer objeto que devuelve JQuery de esta manera:

if ($(".mydivclass")[0]){
    // Do something if class exists
} else {
    // Do something if class does not exist
}

En este caso, si hay un valor verdadero en el primer [0]índice ( ), entonces suponga que la clase existe.

Editar 10/04/2013: he creado un caso de prueba jsperf aquí .


Buen punto, de cualquier manera es solo una búsqueda de propiedades. No me importa acerca de los cuatro personajes, pero esto podría ser más claro dependiendo del contexto ...
TJ Crowder

Terminé usando esta solución, aunque hay otras soluciones que también funcionan. Gracias por las respuestas rápidas.
avatar

1
Curiosamente, es posible que piense que arrojar un :firstallí ayudaría al rendimiento (no sé si el rendimiento es un criterio importante para @itgorilla), pero si varía enormemente según el navegador, presumiblemente porque cambia las características nativas que jQuery puede usar para hacer el selección. Aquí hay un caso de prueba donde existe el div , y aquí hay uno donde no existe .
TJ Crowder

¿Y si no quiero ejecutar un código si no existe una clase?
Thomas Sebastian

1
@ThomasSebastian Tryif (!$(".mydivclass")[0]){ /* do stuff */ }
Shaz

117

Puede usar size(), pero jQuery recomienda usar la longitud para evitar la sobrecarga de otra llamada de función:

$('div.mydivclass').length

Entonces:

// since length is zero, it evaluates to false
if ($('div.mydivclass').length) {

http://api.jquery.com/size/

http://api.jquery.com/length/

ACTUALIZAR

La respuesta seleccionada utiliza una prueba de rendimiento, pero es ligeramente defectuosa ya que también incluye la selección de elementos como parte del rendimiento, que no es lo que se está probando aquí. Aquí hay una prueba de rendimiento actualizada:

http://jsperf.com/check-if-div-exists/3

Mi primera ejecución de la prueba muestra que la recuperación de propiedades es más rápida que la recuperación de índice, aunque IMO es bastante insignificante. Todavía prefiero usar la longitud ya que para mí tiene más sentido la intención del código en lugar de una condición más concisa.


3
Según el enlace que proporcionó a la herramienta en jsperf.com, .lengthactualmente ofrece el mejor rendimiento promedio.
gmeben

Satisface mis necesidades con el menor impacto en el rendimiento para una verificación.
David O'Regan

77

Sin jQuery:

JavaScript nativo siempre será más rápido. En este caso: (ejemplo)

if (document.querySelector('.mydivclass') !== null) {
    // .. it exists
}

Si desea verificar si un elemento padre contiene otro elemento con una clase específica, puede usar cualquiera de los siguientes. (ejemplo)

var parent = document.querySelector('.parent');

if (parent.querySelector('.child') !== null) {
    // .. it exists as a child
}

Alternativamente, puede usar el .contains()método en el elemento padre. (ejemplo)

var parent = document.querySelector('.parent'),
    child = document.querySelector('.child');

if (parent.contains(child)) {
    // .. it exists as a child
}

..y finalmente, si desea verificar si un elemento dado simplemente contiene una determinada clase, use:

if (el.classList.contains(className)) {
    // .. el contains the class
}

57
$('div').hasClass('mydivclass')// Returns true if the class exist.

3
Es cierto que esta es una alternativa, pero costosa. Será más lento que el enfoque utilizado en las respuestas anteriores ( notablemente más lento, en algunos navegadores) y también tendrá un impacto en la memoria mucho mayor (jQuery tiene que construir una matriz de todos los divelementos en la página, luego regresar y recorrerlos para ver si tienen esa clase, todo para tirar la matriz al final).
TJ Crowder

3
@tj hasClasses 33% más rápido que los otros selectores aquí. Visite jsperf.com/hasclass00
Hussein el

1
@Hussein: Solo con un caso de prueba completamente irreal (dos divelementos) que evita el problema que destaqué (construir la matriz). Pruébelo con un montón de divs: jsperf.com/hasclass00/2 Es un 63% más lento en mi copia de Chrome, un 43% más lento en mi copia de Firefox, un 98% (!) Más lento en Opera. Pero además, tiene sentido que sea más lento crear una lista de divs y luego buscarla, en lugar de darle al motor de selección toda la información que necesita.
TJ Crowder

1
@Hussein: Tenga en cuenta que he sido muy imparcial y he presentado pruebas contrarias equilibradas a sus reclamos. Lo siento si toqué un nervio, eso pareció suceder la última vez también. Solo relájate, no es una afrenta personal, es una discusión técnica. Una piel gruesa y una mente abierta son útiles en StackOverflow.
TJ Crowder

1
@Hussein: el selector CSS CSS de HTML5 significa que seguramente será la peor forma posible de hacerlo. -1 por no simplemente eliminar tu publicación.
Stefan Kendall el



10

Para probar divelementos explícitamente:

if( $('div.mydivclass').length ){...}


Esto puede ser un poco más lento que .mydivclassdependiendo del navegador y la versión de jQuery.
Stefan Kendall

Es cierto, pero el OP dijo específicamente "jQuery - verifique si existe div con cierto nombre de clase " (mi énfasis), para que obtenga mi voto por ser el primero en incluir realmente la divparte del selector.
TJ Crowder

7

El código simple se da a continuación:

if ($('.mydivclass').length > 0) {
   //Things to do if class exist
}

Para ocultar el div con la identificación del participante:

if ($('#'+given_id+'.mydivclass').length > 0) {
   //Things to do if class exist
}

3

Aquí hay algunas maneras:

1.  if($("div").hasClass("mydivclass")){
    //Your code

    //It returns true if any div has 'mydivclass' name. It is a based on the class name
    }

2. if($("#myid1").hasClass("mydivclass")){
    //Your code


    //  It returns true if specific div(myid1) has this class "mydivclass" name. 
    //  It is a  based on the specific div id's.
    }           
3. if($("div[class='mydivclass']").length > 0){
    //Your code

   // It returns all the divs whose class name is "mydivclass"
   //  and it's length would be greater than one.
    }

Podemos usar cualquiera de las formas definidas anteriormente según el requisito.


2
if ($(".mydivclass").size()){
   // code here
}

El size()método solo devuelve el número de elementos que selecciona el selector jQuery, en este caso el número de elementos con la clase mydivclass. Si devuelve 0, la expresión es falsa y, por lo tanto, no hay ninguno, y si devuelve cualquier otro número, los divs deben existir.


1
¿Por qué llamar a un método cuando hay una lengthpropiedad? Además, esto busca cualquier elemento con esa clase, no solo un div. (Ahora, eso puede ser lo que el OP quiso decir, incluso si no fue lo que dijo). Vea la respuesta de Stefan Kendall que hace lo que el OP realmente dijo (aunque, de nuevo, pueden haber significado lo que usted ha hecho).
TJ Crowder

1
@TJ Crowder: Bueno, el gusto personal realmente, solo siento que el método size () está ahí, ¿por qué no usarlo? La sobrecarga adicional al llamar a una función (a menos que lo esté haciendo 1000 veces en un bucle) es tan mínima que preferiría un poco de claridad en el código. En su segundo punto, sí, cambié mi respuesta original para eliminar la divparte, por dos razones: 1) el selector no está tan limitado al hecho de que OP usa un divelemento (podría cambiar en el futuro), y 2) en La mayoría de los navegadores y versiones de jQuery, AFAIK, esto debería ser más rápido.
Herman Schaaf

"Siento que el método size () está ahí, ¿por qué no usarlo?" Um, está bien. La lengthpropiedad está ahí, ¿por qué no usarla? Pero si es su preferencia, justo 'nuff. Por otro lado, no sabía que lo había editado. Si fuera a hacer eso, lo habría dejado (nuevamente, él dijo específicamente "... si div con ..." (mi énfasis) y luego mencionó adicionalmente que si no importaba si fue divo no, podrías deshacerte de esa parte. Pero lo que sea. :-)
TJ Crowder

@TJ Crowder: Sí, creo que estamos pensando demasiado en esto.
Herman Schaaf

@TJ Crowder: Pero en mi defensa, aunque este no es el lugar para la discusión: creo que el size()método está ahí para dejar en claro que estás contando el número de elementos en un selector jQuery, y no cualquier matriz antigua. Pero de nuevo, esa es solo mi preferencia.
Herman Schaaf

2

verificar si el div existe con cierta clase

if ($(".mydivclass").length > 0) //it exists 
{

}

2
if($(".myClass")[0] != undefined){
  // it exists
}else{
  // does not exist
}

2
Parece casi idéntico a esta respuesta existente .
Pang

Sí, lo hace ... pero intenté esa respuesta y no funcionó. Cuando agregué la comparación a 'indefinido', parecía funcionar perfectamente.
escalera

2
var x = document.getElementsByClassName("class name");
if (x[0]) {
alert('has');
} else {
alert('no has');
}

Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
Vishal Chhodwani el

2

En Jquery puedes usarlo así.

if ($(".className")[0]){

   // Do something if class exists

} else {

// Do something if class does not exist

}

Con JavaScript

if (document.getElementsByClassName("className").length > 0) {

// Do something if class exists

}else{

    // Do something if class does not exist

}

2

Aquí hay una solución de muestra para check class (hasClass) en Javascript:

const mydivclass = document.querySelector('.mydivclass');
// if 'hasClass' is exist on 'mydivclass'
if(mydivclass.classList.contains('hasClass')) {
   // do something if 'hasClass' is exist.
}

1

La mejor manera en Javascript:

if (document.getElementsByClassName("search-box").length > 0) {
// do something
}


0

Use esto para buscar en toda la página

if($('*').hasClass('mydivclass')){
// Do Stuff
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.