8
votes

Cross-Fenêtre JavaScript: Y a-t-il une bonne façon?

Problème

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 json.stringify code> dans la mesure du possible, ou instance de tableau Code>. P>

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> xxx pré>

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 nouveau w.Object code>, etc., car il ne se sent pas comme si cela devrait être aussi compliqué. P>

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>


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> xxx pré>

J'ai essayé de travailler autour de cela en définissant 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>

Il semble que l'appelant 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


3 commentaires

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.


4 Réponses :


0
votes

Pour voir cela, ouvrez la console de Firebug et essayer:

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

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.


0 commentaires

1
votes

Pour ce que ça vaut la peine, c'est ce que je fais pour l'instant:

  • Assurez-vous que JQuery-Json est chargé dans la fenêtre contextuelle
  • stringifiez l'objet
  • appelez w. $. Evaljson (str) , qui lie les primitives correctement
  • passe qui résulte de la méthode sur la popup

    Alternativement (si JQuery-JSON n'est pas disponible), vous pouvez injecter le script suivant dans la cible: xxx

    comme cela capturera le JSON de la popup et pas l'appelant.

    De meilleures solutions satisfaites volontiers.


0 commentaires


1
votes

Je ne peux pas dire que je comprends votre problème pleinement, mais il y a une fenêtre intéressante.name 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 la longueur de la fenêtre nom variable. Ce qui est génial, c'est que cette variable ne soit pas mouillée / effacée sur la page Changer / rafraîchir, donc avec une utilisation intelligente des iframes, vous obtenez un transport croisé simple et sécurisé :)


1 commentaires

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.