javascript - variable - ¿Cuál es el punto de document.defaultView?
dom javascript tutorial (4)
De acuerdo con el artículo de MDN getComputedStyle
,
En muchos ejemplos de código en línea,
getComputedStyle
se usa desde el objetodocument.defaultView
.En casi todos los casos, esto es innecesario, ya que
getComputedStyle
existe en el objetowindow
.Es probable que el patrón DefaultView sea una combinación de
- gente que no quiere escribir una especificación para ventana y
- haciendo una API que también se podía usar en Java.
Sin embargo, hay un solo caso en el que se debe usar el método de la vista por
defaultView
: cuando se usa Firefox 3.6 para acceder a los estilos enmarcados.
¿Cuál es el punto de document.defaultView
?
MDN dice :
En navegadores devuelve el objeto de ventana asociado con el documento o nulo si no hay ninguno disponible.
Código como el siguiente (desde el sitio de PPK ) hace uso de document.defaultView
:
function getStyle(el,styleProp)
{
var x = document.getElementById(el);
if (x.currentStyle)
var y = x.currentStyle[styleProp];
else if (window.getComputedStyle)
var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
return y;
}
El código de este tipo se puede encontrar en otros lugares, como My Library de David Mark. No estoy seguro de si la gente está copiando de PPK o de alguna otra fuente o si se trata de esto de forma independiente, pero no lo entiendo.
Mi pregunta es, ¿de qué sirve usar document.defaultView
en casos como este? ¿No sería más fácil escribir esto de la siguiente manera?
function getStyle(element, styleProp) {
if (element === ''''+element) element = document.getElementById(element);
return element.currentStyle ? element.currentStyle[styleProp] :
getComputedStyle(x,null).getPropertyValue(styleProp);
}
¿Qué document.defaultView.getComputedStyle
hace ese window.getComputedStyle
o simplemente getComputedStyle
no?
La respuesta de los lobos me hizo pensar en la dirección correcta. La función original es tonta, falta el punto de defaultView
. Mi propuesta anterior es menos tonta, pero también me falta el punto de defaultView
. Aquí está mi nueva propuesta:
function getStyle(element, styleProp) {
var view = element.ownerDocument && element.ownerDocument.defaultView ?
element.ownerDocument.defaultView : window;
return view.getComputedStyle ?
view.getComputedStyle(element,null).getPropertyValue(styleProp) :
element.currentStyle ?
element.currentStyle[styleProp] : null;
}
El elemento en sí debe ser pasado, no el id. Creo que esto es probablemente preferible de todos modos. Esto obtiene el documento que contiene el nodo y la ventana asociada a él. Tiene una alternativa al getComputedStyle
la ventana actual si ownerDocument
o ownerDocument
están rotos (recuerdo vagamente que getComputedStyle
está antes que defaultView
). Esto es probablemente más cercano al uso previsto de defaultView
.
El OP hace la pregunta, "¿Qué sentido tiene document.defaultView
", Y la respuesta realmente no tiene nada que ver con getComputedStyle. La propiedad document.defaultView
es simplemente una forma de obtener el objeto de window
si se tiene una referencia al objeto de document
contenido en esa window
. Hay casos en los window
objeto de window
que está buscando hacer referencia (o vista defaultView
) no está en el mismo ámbito de ventana que el código que está ejecutando.
Un ejemplo de esto es si tiene una referencia al objeto del document
en un iframe, y desea obtener convenientemente una referencia al objeto window
de ese iframe.
Otro caso podría ser el que está ejecutando en contexto privilegiado en el ámbito del navegador (por ejemplo, el código de Chrome en Firefox), y tiene una referencia al document
objeto de un navegador de pestañas u otra ventana.
O, como señala Dagg Nabbit, si en alguno de estos casos tiene una referencia a un elemento dentro de la ventana, puede acceder a la window
padre de ese elemento a través de element.ownerDocument.defaultView
Es simplemente una abstracción, por lo que puedo decir, por si acaso algún agente de usuario aparece con una implementación de DOM, pero no proporciona una vista en forma de ventana. Ver Views en DOM nivel 2.
No estoy seguro de esto, pero me imagino que es el resultado de corregir un error, ya sea al intentar ejecutar el código en un documento separado (es decir, algo que existe en la memoria pero no está en la página) o al intentar ejecutarlo en un documento en una ventana diferente (por ejemplo, un iframe o una ventana emergente).
Según su cita, cuando document.defaultView
se ejecuta en un documento que NO es el documento actual, obtendrá el objeto de ventana asociado, por lo tanto document.documentView.getComputedStyle !== getComputedStyle
dado que se encuentran en contextos diferentes.
En resumen, creo que es similar a document.window
que no existe.