2013-11-25 87 views
3

我試圖構建一個可以處理AJAX應用程序的爬蟲。我正在使用htmlunit以編程方式瀏覽。如何使用java獲取DOM事件偵聽器

  • 我不能找到一個辦法讓所有分配給一些 DOM元素的事件監聽器。我不喜歡我的抓取工具嘗試在每個DOM元素上盲目地調用事件 。

  • 所以我決定重寫javascript addEventListner函數,所以 它可以保留事件監聽器的註冊表。問題是:如何 注入這個修改的JavaScript代碼,並確保它是第一個 頁面加載時運行的東西?

  • 另一個問題:有沒有更好的方法來解決這個問題,我希望 是像getEventListners(domElement)這樣的函數。

爬網程序需要知道分配給DOM元素的事件而不觸發事件。

回答

1

您可以覆蓋addEventListener方法是這樣的:

// Create a copy or addEventListener for subsequent calls 
HTMLElement.prototype.realAddEventListener = HTMLElement.prototype.addEventListener; 

// This array should contains all listeners added to each element 
HTMLElement.prototype.allListeners = []; 

HTMLElement.prototype.addEventListener = function(a,b,c){ 
    this.realAddEventListener(a,b,c); 
    this.allListeners.push({a : a, b : b , c : c}); 
}; 

你可以得到所有的聽衆呼籲allListeners財產上的每個HTML元素在頁面上。

+0

問題是:如何注入此修改的JavaScript代碼,並確保它是頁面加載時運行的第一件事情... ...以這種方式進行編程的請求:webClient.getPage(「http:// localhost/.. ...「); *我需要在原始addEventLitener BEEN INVOKED之前注入重寫的addEventListener方法在RESPONSE中執行。 – matrmawi

+0

我認爲你可以使用ScriptPreprocesor來完成這個任務:http://htmlunit.sourceforge.net/apidocs/com/gargoylesoftware/htmlunit/ScriptPreProcessor.html – jonathansamines

+0

謝謝,,,這看起來很有希望,我會運行一些測試。 – matrmawi