2013-11-25 53 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