2009-08-27 7 views
44

Puedo obtener window.document pero ¿cómo puedo obtener document.window? Necesito saber cómo hacerlo en todos los navegadores.¿Cómo obtengo el objeto Window del objeto Document?

+2

me atrevo a preguntar por qué? window es un objeto siempre disponible y siempre hay no más de 1 documento en una ventana, una relación de 1-1, por así decirlo ... – Colin

+4

Porque estoy usando prototipos en múltiples iframes, y los diversos métodos de Elemento se rompen en IE o Safari si el elemento de algún modo se extiende en el ámbito incorrecto. He revisado algunas cosas para solucionar este problema en prototipo, pero una parte de la solución me exige encontrar en qué ventana se encuentra un elemento. – Joren

+0

@Joren, por favor considere cambiar a la respuesta aceptada. – kay

Respuesta

-1

The Window object is the top level object in the JavaScript hierarchy, por lo que sólo se refieren a ella como la ventana

Editar: Respuesta original antes Promote JS esfuerzo. JavaScript technologies overview en Mozilla Developer Network dice:

En un entorno de navegador, este objeto global es el objeto de la ventana.

Edición 2: Después de leer el comentario del autor a su pregunta (y conseguir downvotes), esto parece estar relacionado con la ventana del documento del marco flotante. Eche un vistazo a window.parent y window.top y quizás los compare para inferir la ventana de su documento.

if (window.parent != window.top) { 
    // we're deeper than one down 
} 
+7

Después de 'abrir()' la 'ventana' de la ventana nueva es otra' ventana' que el 'abrelatas'.Si recibe un 'documento' (o cualquier' Nodo') de alguna función, es posible que necesite la ventana original. (Wow esto es muy viejo.) – Rudie

77

Usted puede ir con document.defaultView si está seguro de que es una ventana y está bien saltarse los navegadores Microsoft Internet Explorer 9. antes

+6

Sí. Solo recuerde que según las especificaciones, 'document.defaultView' no tiene que ser el mismo objeto que' window' (y, de hecho, es diferente en algunos clientes anteriores, por ejemplo: Safari 2.x) – kangax

+0

Funciona bien para documentos XUL en Firefox también! gracias :) – macguru2000

+1

doc.parentWindow || doc.defaultView, y funciona en viejo IE y Safari –

3

Bueno, esta es la solución que fui con. Funciona, pero lo odio.

getScope : function(element) { 
    var iframes = top.$$('iframe'); 
    var iframe = iframes.find(function(element, i) { 
     return top[i.id] ? top[i.id].document == element.ownerDocument : false; 
    }.bind(this, element)); 
    return iframe ? top[iframe.id] : top; 
} 
+0

IE solo veo ... –

+0

¿Qué es IE solo al respecto? Parece funcionar bien en FF \ Saf \ IE \ Chrome. No es necesario en cualquier cosa excepto en IE, sin embargo, dado que los otros navegadores extienden los elementos automáticamente en el alcance correcto. – Joren

17

se complica Una solución de navegadores, así es como lo hace dojo (de window.js :: get()):

// In some IE versions (at least 6.0), document.parentWindow does not return a 
// reference to the real window object (maybe a copy), so we must fix it as well 
// We use IE specific execScript to attach the real window reference to 
// document._parentWindow for later use 
if(has("ie") && window !== document.parentWindow){ 
    /* 
    In IE 6, only the variable "window" can be used to connect events (others 
    may be only copies). 
    */ 
    doc.parentWindow.execScript("document._parentWindow = window;", "Javascript"); 
    //to prevent memory leak, unset it after use 
    //another possibility is to add an onUnload handler which seems overkill to me (liucougar) 
    var win = doc._parentWindow; 
    doc._parentWindow = null; 
    return win; // Window 
} 

return doc.parentWindow || doc.defaultView; // Window 

tiene ("decir") devuelve verdadero para IE (y falso de lo contrario)

0

primero seamos claros. este tipo de cosas a menudo es necesario cuando trabajas con marcos, marcos flotantes y ventanas múltiples, por lo que "la ventana es solo el objeto global" es una respuesta insatisfactoria si todo lo que tienes es un documento otra ventana que el que está adentro.

En segundo lugar, desafortunadamente no hay directa manera de llegar al objeto de la ventana. hay formas indirectas.

el mecanismo principal para usar es window.name. al crear una ventana o un marco desde una ventana principal, generalmente puede darle un nombre único. cualquier script dentro de esa ventana puede acceder a window.name. cualquier script fuera de la ventana puede acceder al window.name de todas sus ventanas secundarias.

para obtener más específico que eso requiere más información sobre la situación específica. sin embargo, en cualquier situación en la que las secuencias de comandos de los niños se puedan comunicar con las secuencias de comandos de los padres o viceversa, siempre pueden identificarse por su nombre, y esto suele ser suficiente.

Cuestiones relacionadas