2012-02-07 14 views
28

¿Cuál es el punto de document.defaultView?¿Cuál es el punto de document.defaultView?

MDN says:

En los navegadores devuelve el objeto ventana asociada con el documento o null si no hay ninguna disponible. Código

como el uso siguiente (de PPK's site) hace 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; 
} 

código como este se puede encontrar en otros lugares, como David Mark Mi biblioteca. 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, ¿cuál es el punto de usar document.defaultView en casos como este? ¿No sería más fácil de escribir 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é hace que document.defaultView.getComputedStylewindow.getComputedStyle o simplemente getComputedStyle no?


La respuesta de cwolves 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 propio elemento se debe pasar, 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 a la ventana actual getComputedStyle si ownerDocument o defaultView están rotos (recuerdo vagamente que getComputedStyle estaba antes que defaultView). Esto es probablemente más cercano al uso previsto de defaultView.

Respuesta

6

No soy positivo en esto, pero imagino que es el resultado de corregir un error ya sea al tratar de ejecutar el código en un documento separado (es decir, algo que existe en la memoria pero no está en la página) o intentar ejecutar en un documento en una ventana diferente (por ejemplo, un iframe o una ventana emergente).

Según su presupuesto, 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 ya que están en contextos diferentes.

En resumen, creo que es similar a document.window que no existe.

+0

Lo mismo sucedería con otra forma de expresión que ser, solo es útil si todavía no tiene un control para la ventana/global asociado con el documento? –

+1

no necesariamente - Como he dicho, puede tener varios documentos diferentes (iframes) por lo que es un enlace a esa ventana específica (por ejemplo, 'iframe.contentWindow' contra' window' vs 'iframe2.contentWindow'). También se puede mover un documento, por lo que incluso si almacena ese enlace original, puede cambiarlo. Esto es, creo, una forma segura de referenciar 'ventana actual' del' documento' –

+0

Tienes razón. Actualizando la pregunta con una nueva propuesta sobre cómo debería verse la función. –

3

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 el nivel de DOM 2.

+0

No creo que exista tal UA. –

+1

DOM 2 Vistas está obsoleto. La propiedad 'defaultView' se define en el estándar HTML ahora. –

+0

@ Šime Vidas: Interesante. Parece que lo movieron fuera de DOM 3 en conjunto y en HTML. Sin embargo, ahora estoy teniendo dificultades para navegar por whatwg.org, ¿podría proporcionar un enlace? : | – BoltClock

2

Según MDN getComputedStyle article,

En muchos ejemplos de código en línea, getComputedStyle se utiliza desde el objeto document.defaultView.

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

Es probable que el patrón defaultView era una combinación de

  1. gente que no quería escribir una especificación para la ventana y
  2. hacer una API que también era utilizable en Java.

Sin embargo, hay a single case donde se debe utilizar el método defaultView 's: cuando se utiliza Firefox 3.6 para acceder a estilos enmarcadas.

+3

'defaultView' es útil porque puedes hacer' someElement.ownerDocument.defaultView' y seguirá funcionando si el elemento proviene de otro documento/ventana, como un marco o un 'window.open' o lo que sea. Los ejemplos habituales que ves flotando parecen haber pasado por alto esto. Traté de volver atrás y explicarlo en la pregunta después de que me di cuenta. –

+0

@DaggNabbit Como dice el artículo de MDN, esto fue solo para Firefox 3.6. Ahora puede usar 'window' y también funciona: [** Demo **] (http: // jsfiddle.net/WQYbL /) – Oriol

+0

Lo que realmente me impresionó de los ejemplos de PPK y DM fue que usaban 'defaultView' de una manera que era equivalente a usar' window', porque acababan de usar la propiedad 'document' global en lugar del documento asociado con el elemento, por lo que no estaba haciendo nada útil de todos modos AFAICT. –

3

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 window si se tiene una referencia al objeto document contenido en ese window. Hay casos en los que el objeto window que busca hacer referencia (o defaultView) no está en el mismo alcance de ventana que el código que está ejecutando.

Un ejemplo de esto es si usted tiene una referencia al objeto document en un iframe, y desea obtener convenientemente una referencia a la window objeto de ese marco flotante.

Otro caso podría ser cuando se está ejecutando en contexto privilegiado en el ámbito del navegador (por ejemplo, código de Chrome en Firefox), y tiene una referencia al objeto document de un navegador de pestañas u otra ventana.

O, como señala Dagg Nabbit, si en cualquiera de estos casos tiene una referencia a un elemento dentro de la ventana, se puede acceder a los padres window de ese elemento a través element.ownerDocument.defaultView