press premium precio plugin generatepress generate elementor blog jquery jquery-selectors

jquery - premium - diferencia entre: primero y: primer hijo no está claro



generatepress woocommerce (5)

estoy teniendo una lista ul li

<ul> <li>Parent <ul> <li> child1 </li> <li> child2 </li> </ul> </li> </ul>

y estoy tratando de usar un selector jQuery(''ul li:first'') y jQuery(''ul li:first-child'') ambos dan el mismo resultado. Esto me confunde sobre la diferencia entre los dos. Hay un ejemplo que aclara la diferencia entre dos selectores


A veces, pero no siempre, el resultado es (y debería) ser el mismo.

Dado su HTML:

jQuery(''ul li:first'').length; // Returns 1 jQuery(''ul li:first-child'').length; // Returns 2

Entonces, puedes ver, que la primera línea está devolviendo solo el primer elemento li .

La segunda línea está devolviendo ambos elementos li que son un first-child de sus padres.

:first devuelve el primero en un conjunto emparejado.

:first-child devuelve elementos que son el primer elemento secundario de su padre.

El primer elemento li en su HTML también es un primer elemento secundario, aunque usar :first-child produce más resultados cuando prueba la propiedad length .

En realidad, podría combinar los dos selectores si solo desea la primera coincidencia que es un primer hijo.

jQuery(''ul li:first-child:first'').length; // Returns one


De tu ejemplo:

$(''ul li''); // Returns all 3 li''s // <li> Parent ... </li> // <li> child1 </li> // <li> child2 </li> $(''ul li:first''); // Returns the first li of all matching li''s from above // <li> Parent ... </li>

Suponiendo que tenemos los tres resultados del primer selector $("ul li") , entonces :first-child filtrará cualquier elemento de esa lista que no sea el primer hijo de su padre. En este caso, <li> child2 </li> se filtra porque es el segundo hijo de un <ul> .

$(''ul li:first-child'')​;​ // Returns all li''s that are the first child of any ul // <li> Parent .. </li> // <li> child1 </li>

Además, para el selector de primer hijo, el elemento debe ser el primer hijo en el DOM, y no en el conjunto de resultados de jQuery. Por ejemplo, con la estructura dada:

<div> <h1>First</h1> <span>Second</span> <span>Third</span> </div>

la siguiente consulta arrojará 0 resultados, ya que <span> no es el primer hijo de div.

$("div span:first-child")

Una buena manera de entender al first-child sería pensar en él como un filtro que filtrará cualquier elemento del conjunto de resultados actual, si no es el primer elemento secundario de su elemento primario.


Esta es una ilustración de lo que $("prev next:first") y $("prev next:first-child") realmente seleccionarían:

<prev> <next>...</next> // <- both `:first` & `:first-child` <next>...</next> <next>...</next> </prev> <prev> <next>...</next> // <- only `:first-child` (NOT `:first`) <next>...</next> <next>...</next> </prev>

:first devuelve solo el primer resultado, mientras que :first-child devuelve un resultado por padre (si existe).


cuando usamos :first selecciona el primer elemento secundario del primer elemento especificado y cuando usamos :first-child selecciona todo el primer elemento secundario del elemento especificado.

$(document).ready(function(){ $("#btnfirst").click(function(){ $("ul li:first").hide(); }); $("#btnfirstChild").click(function(){ $("ul li:first-child").hide(); }); });

<html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> </head> <body> <p>List 1:</p> <ul> <li>Book</li> <li>pen</li> <li>pencil</li> </ul> <p>List 2:</p> <ul> <li>Book</li> <li>pen</li> <li>pencil</li> </ul> <button Id="btnfirst">:first</button> <button Id="btnfirstChild">:first-child</button> </body> </html>


De los documentos oficiales:

La primera pseudo-clase es equivalente a: eq (0). También podría escribirse como: lt (1). Si bien esto coincide solo con un elemento,: first-child puede coincidir más de uno: uno para cada padre.

Si bien :first coincide solo con un elemento, el selector :first-child puede coincidir con más de uno: uno para cada padre. Esto es equivalente a :nth-child(1) .

:first

Actualizar:

Aquí hay un ejemplo usando :first-child :

http://jsbin.com/olugu

Puedes ver su catálogo y editarte tú mismo. Si reemplaza :first-child con :first , solo resaltará la primera palabra allí. Esto es lo que se define para ellos.

Y aquí está el ejemplo usando :first :

http://jsbin.com/olugu/2