w3schools variable tutorial javascripts getelement javascript dom

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 objeto document.defaultView .

En casi todos los casos, esto es innecesario, ya que getComputedStyle existe en el objeto window .

Es probable que el patrón DefaultView sea una combinación de

  1. gente que no quiere escribir una especificación para ventana y
  2. 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.