javascript - all - ¿Cuál es el equivalente en JS de vainilla de $(documento) de jQuery?
jquery replace all (4)
Estoy tratando de averiguar el equivalente de vainilla del siguiente código:
$(document).attr(''key'', ''value'');
Hasta ahora he mirado en
-
document
: no es un elemento, por lo que no puede llamar asetAttribute
en él -
document.documentElement
- devuelve la etiquetahtml
. Este no es el mismo "elemento" al que se dirige jquery -
$(document)[0]
parece devolver un elemento de sombra en Chrome Inspector -
$(document).attr(''key'', ''somethingUnique'')
no existe en el Chrome Inspector
¿Está jQuery creando su propio elemento de sombra simulado del documento para que pueda tratarlo como un elemento real? ¿A qué elemento hace referencia jQuery cuando haces $(document)
?
Creo que estás equivocado con respecto a $(document)
no se refiere al document
, por lo tanto, la respuesta es (simplemente):
document[''key''] = ''value''
Por ejemplo, en Chrome:
> $(document)[0] === document
true
> $(document).attr(''blarg'', ''narf'')
n.fn.init [document, context: document]
> document.blarg
"narf"
> document.foo = ''bar''
"bar"
> document.foo
"bar"
Realmente pensé que jQuery habría envuelto elementos DOM, ya que por alguna razón, nunca escribo var x = $(''#x'')
para reutilizarlo más tarde, pero recuerdo $.
Por eso escribí:
Si esta envuelto
Pero después de leer la answer @ t.niese aquí probé
var x = $(''#x'')
var y = $(''#y'')
var ref = x[0]
x[0] = y[0] // hack jQuery Object reference to DOM element
setTimeout(() => x.html(''1''), 1000) // actually writes in #y
setTimeout(() => x.html(''2''), 2000) // actually writes in #y
setTimeout(() => { x.push(ref) }, 2500) // hack jQuery Object reference to DOM element
setTimeout(() => x.html(''3''), 3000) // actually writes in both #x and #y
Y entendido, no escribo var x = $(''#x'')
no porque sea un objeto envuelto, sino exactamente porque no es un objeto envuelto.
Pensé que el punto de entrada de la API era $
, pero puedo ver la API como var api = $()
, y el punto de entrada como (el) => api.push(el)
o (sel) => api.push(document.querySelector(sel))
Puedo $().forEach
pero no puedo $().forEach
cambio o cambio, pero sí eliminar un índice, también
En el ejemplo
setTimeout(() => { x.map((item) => {console.log(item)}) }, 3500)
Registra 0 y 1, no los elementos. Probado utilizando jQuery versión 3.3.1
Un conjunto de resultados de jQuery es un objeto similar a una matriz que, en general, contiene DOMElement
, pero a jQuery realmente no le importa qué tipo tienen los objetos en el conjunto de resultados. Ni los elementos de DOMElements
ni ningún otro elemento que se almacene dentro del conjunto de resultados de jQuery está de alguna manera simulado / envuelto, se almacenan directamente en el conjunto de resultados. jQuery trata de averiguar qué tiene que hacer con esos objetos mirando sus funciones disponibles.
Cuando llama a .attr
, jQuery comprueba cada objeto del conjunto si tiene la función getAttribute
este caso, se supone que también tiene una función setAttribute
.
Si no tiene una función getAttribute
, entonces reenviará la llamada a la función .prop()
, y el prop internamente solo hará:
elem[name] = value
Entonces, si pasas un objeto plano a jQuery, entonces solo establecerá su propiedad.
var a = {
}
$(a).attr(''test'', ''hello world'');
console.dir(a) // for `a` the property `test` is set
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Si agrega una función getAttribute
y setAttribute
a ese objeto, jQuery los llamará:
var a = {
getAttribute() {
},
setAttribute() {
console.log(''setAttribute was called'')
}
}
$(a).attr(''test'', ''hello world'');
console.dir(a);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Sin embargo, siempre debe asumir que la forma y el orden en que jQuery hace estas pruebas pueden cambiar. Además, solo confíe en él si se menciona explícitamente en la documentación.
jQuery solo está asignando el valor al document
directamente.
$(document).attr(''test'', ''hello world'');
console.log(document[''test'']); // prints "hello world"