私はスタンドアロンの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);
これを行う良い方法があるのでしょうか?
:しかし、私はあなたの
QueryInterface
実装を簡素化するためにXPCOMUtils.jsm
moduleを使用することをお勧めします。 – okello私はJavaScriptの楽しさではありませんが、これは本当にいいと思います。 progressListenersだけでなく、XULの他にもたくさんあります。どうもありがとう。 – okello