2011-02-02 9 views
1

特定のウィンドウがXulで開いているかどうかを確認する方法は?Xulで特定のウィンドウが開いているかどうかを確認するには?

デスクトップアプリで既にウィンドウが開いているかどうか確認したいと思います。もしそうなら、私は再びそれを開くことはありません。

- 私の試み

私は、ウィンドウのタイトルを使ってこれを実現しようとしているので、私はwindowManagerからウィンドウのリストを取得し、タイトルをチェックしますが、getAttributeは、Iインターフェースからではありませんクエリすることができます。それはelementからです。どのインタフェースを使用しますか?

var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator); 
var enum = windowManager.getXULWindowEnumerator(null); 
while(enum.hasMoreElements()) { 
    var win = enum.getNext().QueryInterface(Components.interfaces[" WHICH INTERFACE TO PUT HERE? "]); 
    write("WINDOW TITLE = " + win.getAttribute("title")); 
} 

答えて

1
var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator); 
var enum = windowManager.getEnumerator(null); 
while(enum.hasMoreElements()) { 
    var win = enum.getNext().QueryInterface(Components.interfaces.nsIDOMChromeWindow); 
    write("WINDOW TITLE = " + win.document.documentElement.getAttribute("title")); 
} 

あなたがgetXULWindowEnumeratorを使用している場合、あなたはおそらくnsIDOMWindowを使用することができComponents.interfaces.nsIXULWindow

を使用する必要がありますが、窓にあなたの自己を開いた場合は、ウィンドウの名前を設定するための属性名オープン関数で。あなたはそれが新しいウィンドウを毎回表示されたウィンドウ名を空白のままにしている場合は、もう少し柔軟

var win = window.open("chrome://myextension/content/about.xul", 
          "windowName", "chrome,centerscreen"); 

write("WINDOW NAME: " + win.name); // Should now give WINDOW NAME: windowName 

を持っているので、これはユーザーには表示されません。ただし、ウィンドウ名( ""以外)を使用すると、ウィンドウ名が存在しない場合は作成されます。または、指定した名前で既存のウィンドウに新しいコンテンツを読み込みます。

あなたの望むものとほとんど同じです。バットあなたがする必要がある場合は、リロードを避けるために名前属性を使用することができます。

var openNewWindow = true; 
var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator); 
var enum = windowManager.getEnumerator(null); 

while(enum.hasMoreElements()) { 
    var win = enum.getNext().QueryInterface(Components.interfaces.nsIDOMChromeWindow); 
    if(win.name == "windowName") { 
    openNewWindow = false; 
    } 
} 

if(openNewWindow) { 
    var win = window.open("chrome://myextension/content/about.xul", 
         "windowName", "chrome"); 
} 
+0

最初のアプローチ(getEnumeratorとnsIDomChromeWindow)ではウィンドウが表示されますが、2回目に新しいウィンドウを開いた後、window.open()を使用して開いた新しいウィンドウが表示されませんでした。 getXULWindowEnumeratorとnsIXULWindowを使用すると、 'win.document is undefined'と表示されます。 –

+0

@TomBrito nsIXULWindowインターフェイスは、この[link](http://www.oxymorical.com/experiments/apidocs/platform/1.9.2a1pre/interface/nsIXULWindow)のように見えますが、ドキュメント属性はありません。バットは私のアップデート – LeadingLight

+0

@TomBritoをチェックアウトし、私はもう問題は何か分からないのですか?同じxulファイルから複数のウィンドウを開く場合は、空のウィンドウ名を使用する必要があります。それ以外の場合は、すでに開いている同じ名前のウィンドウをリフレッシュします。 – LeadingLight

3

あなたの文書の<window>要素にwindowtype="myWindowType"属性を設定した場合、あなたはちょうどあなたがすでにオープンしているかどうかを確認するためにwindowMediator.getMostRecentWindow('myWindowType');を使用することができます。

+0

+1良い選択肢を探す –

関連する問題