2012-05-09 57 views
0

如何獲得的所有圖像,解碼如果可能的話,通過XPCOM一個網頁後檢索圖像(如果可能的話解碼)存在於wepage?如何使用XPCOM

的圖像可能會在HTML被指定爲在某些CSS屬性背景網址,img標籤內,或以任何形式的Web開發人員可能包括在內。

我試圖尋找到imgIContainer,imgIDecodeObserver等衆多接口。儘管我們可以通過這種方式向Mozilla提供圖像URI,以便加載圖像,對其進行解碼並返回imgIContainer。但我無法找到當前網頁中的所有圖片。

這必須在Java或Javascript中完成。

有什麼建議嗎?


@Wladimir - 謝謝你的幫忙。

我想要所有圖像,包括CSS結構(背景圖像)。所以現在我正在監聽來自nsIWebProgressListener的事件。


    onStateChange: function(webProgress, request, stateFlags, status) { 
     if ((~stateFlags & (nsIWebProgressListener.STATE_IS_REQUEST | nsIWebProgressListener.STATE_STOP)) == 0) { 
      var imgReq = request.QueryInterface(CI.imgIRequest); 
      if (imgReq) 
       var img = imgReq.image; 
     } 
    } 

問題是request.QueryInterface(CI.imgIRequest)會爲所有非圖像請求引發異常。儘管可以通過將代碼放入try-catch塊來忽略這些異常,但我寧願乾淨地做一些事情。

是否有任何條件可以檢查,以瞭解請求是否爲圖像?

回答

0

您可以查看現有的代碼。 「頁面信息」對話框具有「媒體」選項卡,可成功顯示頁面上的大多數圖像。重要的功能是grabAll() in pageInfo.js,它被稱爲每個元素(通過TreeWalker)。正如你所看到的,沒有通用的方式來獲取圖像,該功能寧可使用window.getComputedStyle()來提取該元素的一堆CSS屬性的值:background-image,border-image,list-style-image,cursor。它還會查找<img>,<svg:image>,<link>(favicon),<input>,<button>,<object><embed>標籤。然而,它無法識別所有事物,例如這些CSS結構將不予確認:

.foo:before 
{ 
    content: url(image.png); 
} 
.foo:hover 
{ 
    background-image: url(image.png); 
} 

不過,這大概是隻要你能得到 - 除非你想看看在加載網頁所提出的要求。

編輯:如果你看一下,因爲他們執行(通過web progress listener)的要求,你可以做到以下幾點:

if (request instanceof CI.imgIRequest) 
    var img = request.URI.spec; 

注意request.image不會幫助你多少,幾乎所有的方法imgIContainer只能從本機代碼訪問。

+0

感謝您的幫助。 – Ankur

+0

正如我所說:「除非您想查看網頁在加載時發出的請求」。然而,你的問題聽起來像你想從已經加載的頁面提取圖像。 –

+0

是的,那就是我想要的。出於某種原因,我無法將我的代碼放在適當的格式中。讓我試試更多的技巧來把我的代碼放在這裏。 – Ankur