J'essaie de faire une méthode qui transmet des objets à une méthode similaire dans une fenêtre contextuelle. Je n'ai pas de contrôle sur le code dans la méthode cible ou l'objet est passé. La méthode cible est actuellement sérialisée l'objet, à l'aide de Le premier problème avec ceci est un bogue dans IE8 (voir ci-dessous). Le second, et plus fondamental, est que les primitives ne sont pas les mêmes dans les fenêtres: p> remplacer sur la fenêtre contextuelle des classes pouvant être transmises, puis les restaurer après le Call Works, mais c'est vraiment fragile et un maux de tête de maintenance. p> sérialiser l'objet dans JSON puis l'analyser dans le contexte de la fenêtre frappe le bogue Firefox ci-dessous. P> Je suis Aussi un peu de détester pour faire une copie profonde de l'objet ou analyser le JSON en utilisant Quelqu'un peut-il suggérer un moyen judicieux de faire face à cela, ou devrais-je simplement accepter que les objets ne puissent pas être passés verbatim entre Windows? P> J'ai essayé de travailler autour de cela en définissant Il semble que l'appelant json.stringify code> dans la mesure du possible, ou
instance de tableau Code>. P>
nouveau w.Object code>, etc., car il ne se sent pas comme si cela devrait être aussi compliqué. P>
Ie bogue h2>
Json.stringify code> ne fonctionne pas dans les fenêtres dans IE8. Si je passe un objet à la fenêtre contextuelle, qui tente de le sérialiser, stringify renvoie
non défini code>. Pour voir ce problème, ouvrez la console de script dans IE8 et essayez: p>
w.json = json code>, mais Comme le dernier test montre, cela se casse lorsque vous avez des objets des deux fenêtres. P>
bug firefox h2>
w.Object () code> pour créer Un objet dans Firefox appelle en fait
window.Object () code>. Le même bug est touché lorsque vous appelez
w.json.parse code> ou
w.eval code>. Pour voir cela, ouvrez la console de Firebug et essayez: P>
w = open("http://google.com")
new w.Object instanceof w.Object // returns true
w.Object() instanceof w.Object // returns false on Firefox 3.5
w.Object() instanceof Object // returns true on Firefox 3.5
w.Object.call(w) instanceof Object // returns true on Firefox 3.5
w.JSON.parse("{}") instanceof w.Object // returns false on Firefox 3.5
w.JSON.parse("{}") instanceof Object // returns true on Firefox 3.5
w.eval("[]") instanceof w.Array // returns false on Firefox 3.5
w.eval("[]") instanceof Array // returns true on Firefox 3.5
w.eval.call(w, "[]") instanceof Array // returns true on Firefox 3.5
4 Réponses :
Pour voir cela, ouvrez la console de Firebug et essayer: p> blockQuote>
Erreur: autorisation refusée pour
pour obtenir une fenêtre de propriété.Object de . Sur n'importe quelle ligne, sauf la première: w = ouverte (" http://google.com ") Firefox 3.5.7 P> Pensez un instant: vous essayez d'ouvrir une nouvelle fenêtre avec un site arbitraire et d'envoyer des données informatiques à la disposition de JS. Semble trop peu sûr pour permettre cela. P>
Pour ce que ça vaut la peine, c'est ce que je fais pour l'instant:
w. $. Evaljson (str) code>, qui lie les primitives correctement li>
- passe qui résulte de la méthode sur la popup li>
ul>
Alternativement (si JQuery-JSON n'est pas disponible), vous pouvez injecter le script suivant dans la cible: p> xxx pré> comme cela capturera le JSON de la popup et pas l'appelant. P>
De meilleures solutions satisfaites volontiers. p> p>
Si vous essayez de faire des scripts croisés, on dirait que JSONP A > Peut-être la peine d'être enquêté. p>
Bon point, je ne voulais pas que le tours supplémentaire, mais cela serait effectivement nécessaire si le domaine croisé.
Je ne peux pas dire que je comprends votre problème pleinement, mais il y a une fenêtre intéressante.name code> pirate qui vaut la peine de vérifier: http://www.sitepen.com/blog/2008/07/22/windowname-Transport/ (le blog post utilise Dojo Mais, bien sûr, cela peut être fait avec un JS pur aussi). C'est plus sûr que JSONP, facile à mettre en œuvre et il semble fonctionner sur tous les navigateurs.
Fondamentalement, il vous permet de stocker toutes les données, de toute em> la longueur de la fenêtre
Nice, c'est une façon très pratique de traiter les rafraîchissements. Le seul problème est que j'ai encore besoin de déclencher la mise à jour dans la fenêtre et je ne veux pas vraiment recharger la page.
Le problème n'est pas clairement défini, imo. Vous devez nous dire plus ce que vous essayez de faire, et pas autant sur ce que le problème spécifique est.
Peut-être éliminer le problème tout à fait et utilisez «popups» A'la Lightbox (ou l'un de ses nombreux clones) ou quelque chose que votre favori JS Lib fournit - de cette façon, vous obtiendrez un look cohérent sur tous les navigateurs (la manière dont les popups sont affichés. diffère d'un navigateur à un navigateur), pas de maux de tête primordiaux. En outre, les popups sont SOOOO 199x;) (mais qui sait, peut-être qu'ils sont la meilleure solution à votre problème - je me généralise ici)
Ils ne sont certainement pas la meilleure solution à mon problème, mais parfois, vous n'avez parfois pas ce choix.