2010-06-07 3 views
2

Je débogue une application Web. Javasript dans une fenêtre crée un objet et l'utilise comme argument pour invoquer la méthode globale dans une autre fenêtre. Pseudo code est comme ci-dessous.Comment transférer en toute sécurité une référence à un objet à travers une fenêtre?

var obj = new Foo(); 
anotherWin.bar(obj); 

Dans anotherWin, l'argument est stocké dans la variable globale.

var g_obj; 

function bar(obj) 
{ 
    g_obj = obj; 
    ... 
} 

Quand autre fonction essaie de référencer g_obj.Id, il émet une exception "Impossible d'évaluer l'expression". Cela se produit dans IE8.0.7600.16385 sous Windows 7.

Débogueur Visual Studio, lorsque cette exception se produit, les g_obj montre que

{...} 

Il semble toutes ses propriétés sont perdues.

Peut-être que la raison racine est que l'objet est créé dans une fenêtre mais seulement référencé dans une autre fenêtre. L'objet peut être récupéré à tout moment.

Y at-il un moyen de contourner ce problème?

+0

Ces fenêtres se trouvent-elles dans un jeu de cadres? –

+0

Non, pas dans le jeu de cadres. –

Répondre

1

est-ce une opération unidirectionnelle, ou voulez-vous que les modifications apportées dans un autreWin soient reflétées dans la fenêtre source?

Si c'est un moyen, je le convertirais en une chaîne JSON, je l'enverrais et l'analyserais dans un objet.

en passant une référence peut ne pas être faisable.

+0

C'est une opération à sens unique. –

1

Sérialisez votre objet, envoyez-le, puis désérialisez-le.

4

Les objets DOM ne persistent pas dans les fenêtres. Toutefois, si vous pouvez vivre avec JSON representation, alors je convertir votre objet en JSON, l'envoyer à travers, puis analyser le JSON.

Il existe plusieurs façons d'encoder et de décoder JSON dans javascript (indice: l'utilisation de eval() est un désastre de sécurité).

  • Certains navigateurs modernes (Firefox> = 3.5, Internet Explorer> = 8.0) fournissent des implémentations natives sécurisées et rapides.
  • Certains frameworks javascript (par exemple YUI mais not jquery) provenant de la même fonctionnalité.
  • Le plus reliable way pour ce faire est utilisation de Douglas Crockford json2.js library Il est conforme Standard, sécurisé, rétrocompatible et utilisera l'analyseur natif du navigateur si elle existe.

En utilisant la bibliothèque de Crockford, votre exemple deviendrait:

<script type="text/javascript" src="json2.js"></script> 

[...]

var obj = new Foo(); 
anotherWin.json_bar(JSON.stringify(obj)); 

En anotherWin:

<script type="text/javascript" src="json2.js"></script> 

[...]

var g_obj; 

function bar(obj) 
{ 
    g_obj = obj; 
    [...] 
} 


function json_bar(json_obj) 
{ 
    bar(JSON.parse(json_obj)); 
} 

Ne pas oublier de minifyjson2.js - avec minification conservateur, il est seulement 3,5 kb atteindre la taille de votre chargement de page.

+0

Questions: Le script de Crockford ne fonctionne pas dans Safari 2, car il n'implémente pas Object.hasOwnProperty –

Questions connexes