2011-06-24 2 views
7

Ainsi, le code suivant les fausses alertes à deux reprises:Pourquoi myarray instanceof Array et myarray.constructor === Array false false lorsque myarray est dans un frame?

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

Quand il y a un iframe dans la page nommée « MyFrame » qui a contient un tableau appelé « myarray ». Si le tableau est déplacé dans la page principale (par opposition à l'iframe), le code alerte true deux fois comme prévu. Est-ce que quelqu'un sait pourquoi c'est comme ça?

+1

Qu'est-ce que window.myframe.myarray imprime? Je pensais que vous en aviez besoin window.myframe.document.myarray –

+0

window.myframename.myarray fonctionne très bien dans Chrome et FF ... document.getElementById ('myframeid'). ContentWindow.myarray fonctionne également ... ce que vous êtes suggérer ne semble pas fonctionner ... – zjmiller

+0

err je voulais dire window.myframe.contentWindow.document.myarray –

Répondre

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

longue explication sur les raisons here.constructor échoue avec des cadres.

Les problèmes surviennent lorsqu'il s'agit de créer des scripts dans des environnements DOM multi-images. En un mot, les objets Array créés dans un iframe ne partagent pas les [[Prototype]] avec des tableaux créés dans un autre iframe. Leurs constructeurs sont des objets différents et donc les contrôles instanceof et constructor échouent:

+0

C'est exactement ce que le problème est. – Pointy

+0

Oh, bonne réponse. –

+0

Encore il y a une chance que vous deviez retomber à la dactylographie des bibliothèques de cos peut surcharger le toString facilement (comme si vous chargez [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

Les deux fenêtres créent chacune leur propre environnement de script global.

Le constructeur Array de l'un n'est pas le même objet que l'autre.

var win2=window.myframe; 
alert(win2.myarray instanceof win2.Array); returns true 
Questions connexes