2012-05-10 9 views
0

私はスタンドアロンのXULRunnerアプリケーションを開発しています。このアプリケーションでは、ページのロード時に何が起こっているのかをユーザーにフィードバックすることが重要です。私の最初の実装はMDN tutorialによって導かれました。しかし、これは自分のコードから開いたページでのみ機能します。私は、文書の本文の中のリンクにユーザーのフィードバックを与える方法がありませんでした。さらに検索すると、a forum threadに私に着いた。この男がしたことに続いて、私は、状態の変化、進行の変化、URLの場所の変化など、ページの読み込みイベントを聞くことができました。ページの読み込みが始まると、プログレスバーを表示できるようになりました。また、プログレスバーを非表示にするために、ページが完全にロードされたことを伝えることもできます。私のコードは以下の通りです:スタンドアロンXULRunnerアプリケーションProgressListener

var myExt_urlBarListener = { 
    QueryInterface: function(aIID) 
    { 
     if (aIID.equals(Components.interfaces.nsIWebProgressListener) || 
     aIID.equals(Components.interfaces.nsISupportsWeakReference) || 
     aIID.equals(Components.interfaces.nsISupports)) 
    return this; 
    throw Components.results.NS_NOINTERFACE; 
    }, 

    onLocationChange: function(aProgress, aRequest, aURI) 
    { 
    myExtension.processNewURL(aURI); 
    }, 

    //onStateChange: function(a, b, c, d) {}, 
    onStateChange: function(aProgress, aRequest, aFlag, aStatus) { 
     const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START; 
     const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP; 

     if(aFlag & STATE_START) { 
      document.getElementById("progressBar").hidden = false; 
     } 
     if(aFlag & STATE_STOP) { 
     document.getElementById("progressBar").hidden = true;  
     } 
     return 0; 
    }, 
    onProgressChange: function(a, b, c, d, e, f) { return 0; }, 
    onStatusChange: function(a, b, c, d) { return 0; }, 
    onSecurityChange: function(a, b, c) { return 0; } 
}; 

var myExtension = { 
    oldURL: null, 

    init: function() { 
    // Listen for webpage loads 
    document.getElementById("browser-id").addProgressListener(myExt_urlBarListener, 
     Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT); 
    }, 

    uninit: function() { 
    document.getElementById("browser-id") 
     .removeProgressListener(myExt_urlBarListener); 
    }, 

    processNewURL: function(aURI) { 
    if (aURI.spec == this.oldURL) 
     return; 

     // alert(aURI.spec); 
    document.getElementById("statusBar").setAttribute("label", aURI.spec); 
    // document.getElementById("progressBar").hidden = false; 
    this.oldURL = aURI.spec; 
    } 
}; 

window.addEventListener("load", function() {myExtension.init()}, false); 
window.addEventListener("unload", function() {myExtension.uninit()}, false); 

これを行う良い方法があるのでしょうか?

答えて

0

いいえ、progress listenersを使用してください - これはFirefoxがページの読み込み中にステータスの変更を表示するために使用している方法です。私はそれを試してみましょう

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); 

... 

QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIWebProgressListener, 
             Components.interfaces.nsISupportsWeakReference]), 
+0

:しかし、私はあなたのQueryInterface実装を簡素化するためにXPCOMUtils.jsm moduleを使用することをお勧めします。 – okello

+0

私はJavaScriptの楽しさではありませんが、これは本当にいいと思います。 progressListenersだけでなく、XULの他にもたくさんあります。どうもありがとう。 – okello

関連する問題