2008-09-28 10 views
3

Une page Web est chargée dans la barre latérale de Firefox et une autre page Web est chargée dans le document principal. Maintenant, comment puis-je demander l'accès à l'objet document principal via la barre latérale de Firefox? Un exemple pour faire ceci à travers le code Javascript dans le document de la barre latérale de Firefox pour accéder au document principal serait utile.Firefox Sidebar et objet Document de DOM

Merci pour les réponses. Je dois affiner ma question cependant. La page principale a une page Web chargée et la barre latérale a une page Web. Je veux que la fenêtre de la barre latérale sache quel texte l'utilisateur a sélectionné dans la fenêtre principale quand on clique sur un lien dans la fenêtre de la barre latérale. Je sais comment obtenir le texte sélectionné à partir d'une fenêtre. Seulement que l'élément de barre latérale ajoute la complexité au problème que je ne peux pas surpasser.

@PConory:

J'aime votre réponse, mais quand je l'essayer il y a une erreur:

Error: Permission denied to create wrapper for object of class UnnamedClass.

Merci.

Répondre

1

Accéder à la fenêtre principale à partir d'une barre latérale est beaucoup plus délicat que de revenir dans l'autre sens.

L'arbre DOM vous devrez traverser, selon Mozilla's developer centre, est:

#document 
    window     main-window 
    ... 
     browser 
     #document 
      window   sidebarWindow 

À partir du lien ci-dessus, le code ci-dessous vous permettra d'obtenir à l'objet mainWindow:

var mWin = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIWebNavigation) 
       .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
       .rootTreeItem 
       .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIDOMWindow); 
+0

Cela ne fonctionnera pas pour les pages * web *. Ce code est pour les cas où la page dans la barre latérale est privilégiée (c'est-à-dire fait partie d'une extension). – Nickolay

2

Pour autant que je sache, vous êtes en train de charger un site web dans la barre latérale (cochez la case 'Charger ce signet dans la barre latérale'). Si c'est le cas, ET si la barre latérale ouvre la page de la fenêtre principale. Vous pouvez utiliser window.postMessage pour communiquer entre eux. Mais comme je l'ai dit, la page de la barre latérale doit ouvrir la page principale car vous avez besoin de la référence de la fenêtre pour poster le message.

sidebar.js

var newwin = window.open('http://otherpage') 
newwin.onload = function() 
{ 
newwin.postMessage('Hey newwin', 'http://sidebar'); 
}; 

mainpage.js 
window.addEventListener('message',function(e) 
{ 
if(message.origin == 'http://sidebar') 
    alert('message from sidebar'); 
},false); 

Avec ceci, on n'ont pas encore accès au document, mais peuvent communiquer entre eux et scripter les changements que vous voulez faire.

EDIT: En y réfléchissant davantage, si vous ouvriez la fenêtre depuis la barre latérale, vous auriez le DOM pour cela. var newwin = window.open ('blah'); newwin.document rendant le trou postMessage plutôt inutile.

1

Etes-vous en train d'écrire un javascript sur la page qui permettra la communication entre la page de la barre latérale et la page à onglet? Il existe des restrictions sur les pages qui peuvent se voir et communiquer:

  • Si les pages ne se trouvent pas sur le même domaine, elles ne sont pas autorisées à parler (restriction de même domaine).
  • Si une page n'a pas ouvert l'autre, il n'y a aucun moyen pour l'une ou l'autre page d'acquérir une référence à l'autre.

Je ne suis pas sûr comment une page peut demander l'ouverture d'une page dans la barre latérale, ou vice versa. Mais si vous pouvez gérer cela, utilisez var child = window.open(...) pour obtenir une référence dans une direction et window.opener pour obtenir une référence dans l'autre sens.

+0

Une page ne peut pas ouvrir une barre latérale, mais une page de barre latérale peut ouvrir un nouvel onglet ou une fenêtre contextuelle avec window.open comme vous l'avez suggéré. –

Questions connexes