Me gustaría entender la relación entre el objeto jQuery y el elemento DOM.
Cuando jQuery devuelve un elemento, aparece como [object Object]
una alerta. Cuando getElementByID
devuelve un elemento, aparece como [object HTMLDivElement]
. ¿Qué significa eso exactamente? Quiero decir, ¿son ambos objetos con una diferencia?
Además, ¿qué métodos pueden operar en el objeto jQuery frente al elemento DOM? ¿Puede un solo objeto jQuery representar múltiples elementos DOM?
javascript
dom
jquery
testndtv
fuente
fuente
Respuestas:
Un objeto jQuery es un objeto similar a una matriz que contiene elementos DOM. Un objeto jQuery puede contener varios elementos DOM según el selector que utilice.
Las funciones de jQuery (una lista completa está en el sitio web) operan en objetos jQuery y no en elementos DOM. Puede acceder a los elementos DOM dentro de una función jQuery usando
.get()
o accediendo al elemento en el índice deseado directamente:$("selector")[0] // Accesses the first DOM element in this jQuery object $("selector").get(0) // Equivalent to the code above $("selector").get() // Retrieve a true array of DOM elements matched by this selector
En otras palabras, lo siguiente debería obtener el mismo resultado:
<div id="foo"></div> alert($("#foo")[0]); alert($("#foo").get(0)); alert(document.getElementById("foo"));
Para obtener más información sobre el objeto jQuery, consulte la documentación . Consulte también la documentación para
.get()
fuente
Cuando usa jQuery para obtener un elemento DOM, los retornos del objeto jQuery contienen una referencia al elemento. Cuando usa una función nativa como
getElementById
, obtiene la referencia al elemento directamente, no contenido dentro de un objeto jQuery.Un objeto jQuery es un objeto similar a una matriz que puede contener varios elementos DOM:
var jQueryCollection = $("div"); //Contains all div elements in DOM
La línea anterior podría realizarse sin jQuery:
var normalCollection = document.getElementsByTagName("div");
De hecho, eso es exactamente lo que jQuery hará internamente cuando pasas un selector simple como
div
. Puede acceder a los elementos reales dentro de una colección jQuery usando elget
método:var div1 = jQueryCollection.get(0); //Gets the first element in the collection
Cuando tiene un elemento, o un conjunto de elementos, dentro de un objeto jQuery, puede usar cualquiera de los métodos disponibles en la API jQuery, mientras que cuando tiene el elemento sin procesar, solo puede usar métodos JavaScript nativos.
fuente
Apenas comencé a jugar con jQuery el mes pasado, y tenía una pregunta similar en mi mente. Todas las respuestas que ha recibido hasta ahora son válidas y puntuales, pero una respuesta muy precisa puede ser esta:
Digamos que está en una función, y para referirse al elemento de llamada, puede usar
this
, o$(this)
; ¿Pero, cuál es la diferencia? Resulta que cuando lo usa$(this)
, está envolviendothis
dentro de un objeto jQuery. El beneficio es que una vez que un objeto es un objeto jQuery, puede usar todas las funciones jQuery en él.Es muy potente, ya que incluso se puede envolver una representación de cadena de elementos,
var s = '<div>hello <a href='#'>world</a></div><span>!</span>'
el interior de un objeto jQuery con sólo literalmente, envolviéndolo en $ ():$(s)
. Ahora puedes manipular todos esos elementos con jQuery.fuente
La mayoría de los miembros de jQuery
Functions
no tienen un valor de retorno, sino que devuelven el actualjQuery Object
u otrojQuery Object
.Entonces,
console.log("(!!) jquery >> " + $("#id") ) ;
devolverá
[object Object]
, es decir,jQuery Object
que mantiene la colección que es el resultado de evaluar el selectorString
("#id"
) contra elDocument
,mientras ,
console.log("(!!) getElementById >> " + document.getElementById("id") ) ;
devolverá
[object HTMLDivElement]
(o de hecho[object Object]
en IE) porque / si el valor de retorno es adiv
Element
.(1) Hay una gran cantidad de miembros
Function
en jQuery que pertenecen a DOMObject
. Lo mejor que puede hacer en mi opinión es buscar en la documentación de la API de jQuery una información relevanteFunction
una vez que tenga una tarea específica (como seleccionarNode
o manipularlas).(2) Sí, uno solo
jQuery Object
puede mantener una lista de varios DOMElement
. Hay variosFunctions
(comojQuery.find
ojQuery.each
) que se basan en este comportamiento de almacenamiento en caché automático.fuente
[object Object]
todavía sería undiv
Element
pensamiento. Si se selecciona con jQuery, sería unjQuery Object
.Eso es solo su navegador siendo inteligente. Ambos son objetos, pero los DOMElements son objetos especiales . jQuery simplemente envuelve DOMElements en un objeto Javascript.
Si desea obtener más información de depuración, le recomiendo que consulte las herramientas de depuración como Firebug para Firefox y el inspector integrado de Chrome (muy similar a Firebug).
fuente
Además de lo que se ha mencionado, me gustaría agregar algo sobre por qué el objeto jQuery se importa de acuerdo con la descripción de jquery-object
Por ejemplo, es posible que el conjunto
innerHTML
de elementos no funcione en la mayoría de las versiones de Internet Explorer.Puede configurar innerHTML en forma de jQuery y jQuery lo ayudará a ocultar las diferencias del navegador.
// Setting the inner HTML with jQuery. var target = document.getElementById( "target" ); $( target ).html( "<td>Hello <b>World</b>!</td>" );
jQuery proporciona una lista de métodos vinculados al objeto jQuery para facilitar la experiencia del desarrollador; consulte algunos de ellos en http://api.jquery.com/ . El sitio web también proporciona una manipulación DOM común, veamos cómo insertar un elemento almacenado
newElement
después deltarget
elemento en ambos sentidos.La forma DOM,
// Inserting a new element after another with the native DOM API. var target = document.getElementById( "target" ); var newElement = document.createElement( "div" ); target.parentNode.insertBefore( newElement, target.nextSibling );
La forma jQuery,
// Inserting a new element after another with jQuery. var target = document.getElementById( "target" ); var newElement = document.createElement( "div" ); $( target ).after( newElement );
Espero que esto sea un suplemento.
fuente