对于 XUL/Firefox,您需要的是 nsIIOService 接口,您可以像这样获得它:
var mIOS = Components.classes["@mozilla.org/network/io-service;1"].
getService(Components.interfaces.nsIIOService);
然后你需要创建一个通道,并打开一个异步链接:
var channel = mIOS.newChannel(urlToOpen, 0, null);
channel.asyncOpen(new StreamListener(), channel);
这里的关键是StreamListener
对象:
var StreamListener = function() {
return {
QueryInterface: function(aIID) {
if (aIID.equals(Components.interfaces.nsIStreamListener) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
onStartRequest: function(aRequest, aContext)
{ return 0; },
onStopRequest: function(aRequest, aChannel /* aContext */, aStatusCode)
{ return 9; },
onDataAvailable: function(aRequest, aContext, aStream, aOffset, aCount)
{ return 0; }
};
}
您必须在onStartRequest
, onStopRequest
,onDataAvailable
函数中填写详细信息,但这应该足以让您继续前进。你可以看看我是如何在我的 Firefox 扩展中使用这个接口的(它被称为 IdentFavIcon,它可以在 mozilla 附加组件站点上找到)。
我不确定的部分是如何不时触发此页面请求 set_timeout()
,但应该可以工作。
编辑:
- 有关如何将下载的数据收集到单个变量中的示例,请参见此处的示例(请参见下载图像部分);和
- 请参阅此页面,了解如何将 HTML 源代码转换为 DOM 树。
HTH。