3

Firefox サイドバーにロードされた Web ページと、メイン ドキュメントにロードされた別の Web ページがあります。では、Firefox のサイドバーからメイン ドキュメント オブジェクトへのアクセスを要求するにはどうすればよいでしょうか? Firefox サイドバー ドキュメントの Javascript コードを介してこれを実行し、メイン ドキュメントにアクセスする例が役立ちます。

答えてくれてありがとう。ただし、質問を絞り込む必要があります。メイン ウィンドウにはいくつかの Web ページが読み込まれ、サイドバーには Web ページがあります。サイドバー ウィンドウのリンクがクリックされたときに、ユーザーがメイン ウィンドウで選択したテキストをサイドバー ウィンドウに認識させたい。選択したテキストをウィンドウから取得する方法を知っています。サイドバー要素が問題を複雑にし、私が超えることはできません.

@PConory:

私はあなたの答えが好きですが、試してみるとエラーが発生します:

エラー: クラス 無名クラスのオブジェクトのラッパーを作成する権限が拒否されました。

ありがとう。

4

3 に答える 3

2

私が知る限り、あなたは実際にサイドバーに Web サイトを読み込んでいます (「このブックマークをサイドバーに読み込む」をチェックしてください)。この場合、かつサイドバーがメイン ウィンドウ ページを開いている場合。window.postMessage を使用して、それらの間で通信できます。しかし、私が言ったように、メッセージを投稿するにはウィンドウ参照が必要なので、サイドバー ページはメイン ページを開く必要があります。

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);

これを使用すると、ドキュメントにアクセスすることはできませんが、それらの間で通信し、必要な変更をスクリプト化できます。

編集:サイドバーからウィンドウを開いた場合、もう少し考えてみると、そのためのDOMがあります。var newwin = window.open('何とか'); newwin.document の穴を postMessage にするのはかなり無意味です。

于 2008-09-28T13:24:28.047 に答える
1

サイドバーからメインウィンドウにアクセスすることは、他の方法に戻るよりもはるかに注意が必要です。

Mozillaの開発者センターによると、トラバースする必要のあるDOMツリーは次のとおりです。

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

上記のリンクから、次のコードを使用して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); 
于 2008-09-28T12:54:11.537 に答える
1

サイドバー ページとタブ ページ間の通信を可能にするページ内 JavaScript を記述しようとしていますか? どのページが相互に表示され、通信できるかについては、次の制限があります。

  • ページが同じドメインにない場合、会話は許可されません (同じドメインの制限)。
  • 一方のページで他方のページが開かれなかった場合、いずれかのページが他方のページへの参照を取得する方法はありません。

ページがサイドバーでページを開くように要求する方法、またはその逆の方法がわかりません。ただし、それを管理できる場合var child = window.open(...)は、参照を一方向window.openerに取得し、参照を他の方向に取得するために使用します。

于 2008-09-28T15:54:30.620 に答える