2011-06-24 3 views
7

Así que el siguiente código de falsas alertas en dos ocasiones:¿Por qué myarray instanceof Array y myarray.constructor === Array ambos falsos cuando myarray está en un marco?

window.onload = function(){ 
        alert(window.myframe.myarray instanceof Array); 
        alert(window.myframe.myarray.constructor === Array); 
       } 

Cuando hay un iframe en la página denominada "MyFrame" que tiene contiene una matriz llamada "myarray". Si la matriz se mueve a la página principal (a diferencia del iframe), el código alerta dos veces como se esperaba. ¿Alguien sabe a que se debe esto?

+1

¿Qué imprime window.myframe.myarray? Pensé que necesitabas que fuera window.myframe.document.myarray –

+0

window.myframename.myarray funciona bien en Chrome y FF ... document.getElementById ('myframeid'). ContentWindow.myarray también funciona ... lo que eres sugiriendo que no parece funcionar ... – zjmiller

+0

me refiero a window.myframe.contentWindow.document.myarray –

Respuesta

18
function isArray(o) { 
    return Object.prototype.toString.call(o) === '[object Array]'; 
} 

larga explicación acerca de por qué here.constructor falla con marcos.

Los problemas surgen cuando se trata de secuencias de comandos en entornos de marcos múltiples DOM. En pocas palabras, los objetos Array creados dentro de un iframe no comparten [[Prototype]] con arreglos creados dentro de otro iframe. Sus constructores son objetos diferentes y por lo tanto fallan las comprobaciones instanceof y constructor:

+0

Esto es exactamente lo que es el problema. – Pointy

+0

Oh buena respuesta. –

+0

Todavía existe la posibilidad de que tenga que recurrir a pato escribiendo bibliotecas cos que pueden sobrecargar el toString fácilmente (como si cargara [shumway] (https://github.com/mozilla/shumway/blob/master/src/avm2) /runtime.ts#L1024-L1060): 'Object.prototype.toString.call ([1,2,3]) === '1,2,3'') –

4

Cada una de las dos ventanas crea su propio entorno de script global.

El constructor Array de uno no es el mismo objeto que el otro.

var win2=window.myframe; 
alert(win2.myarray instanceof win2.Array); returns true 
Cuestiones relacionadas