0

私はスタンドアロンのXULRunnerアプリケーションを開発しています。このアプリケーションでは、ページの読み込み中に何が起こっているかについてユーザーにフィードバックを提供することが重要です。私の最初の実装は、 MDNチュートリアルによって導かれました。ただし、これはコードから開いたページでのみ機能します。ドキュメントの本文にあるリンクについて、ユーザーにフィードバックを提供する方法がありませんでした。さらに検索すると、フォーラムのスレッドにたどり着きました。この男がしたことに続いて、状態の変化、進行状況の変化、URLの場所の変化などのページ読み込みイベントを聞くことができました。これで、ページの読み込みが開始されたことがわかり、プログレスバーを表示できるようになりました。また、プログレスバーを非表示にできるように、ページが完全に読み込まれたこともわかります。私のコードは以下のとおりです。

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

これを行うためのより良い方法があるかどうか疑問に思います。

4

1 に答える 1

0

いいえ、進行状況リスナーを使用するのが道のりです。これは、ページの読み込み中にFirefoxがステータスの変更を表示するために使用している方法です。ただし、実装を簡素化するためにXPCOMUtils.jsmモジュールを使用することをお勧めします。QueryInterface

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

...

QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIWebProgressListener,
                                       Components.interfaces.nsISupportsWeakReference]),
于 2012-05-10T18:47:50.387 に答える