如何使用Java获取DOM事件监听器

3
我正在尝试构建一个可以处理AJAX应用程序的爬虫。我正在使用htmlunit进行程序化浏览。
  • 我找不到一种方法来获取分配给某个DOM元素的所有事件侦听器。我不希望我的爬虫盲目地尝试调用每个DOM元素上的事件。

  • 因此,我决定重写javascript的addEventListner函数,以便它可以保留事件侦听器的注册表。问题是:如何注入这个修改后的javascript代码,并确保它是页面加载时运行的第一件事?

  • 另一个问题:是否有更好的解决方法?我希望有像getEventListners(domElement)这样的函数。
爬虫需要知道分配给DOM元素的事件而不触发该事件。
1个回答

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});
};

你可以通过在页面上的每个HTMLElement上调用allListeners属性来获取所有监听器。

问题是:如何注入修改后的JavaScript代码,并确保它在页面加载时首先运行?...程序化地发出请求,如下所示:webClient.getPage("http://localhost/....."); *我需要在响应中注入覆盖的addEventListener方法以在原始的addEventLitener被调用之前执行。 - matrmawi
我认为你可以使用ScriptPreprocesor来实现这个任务:http://htmlunit.sourceforge.net/apidocs/com/gargoylesoftware/htmlunit/ScriptPreProcessor.html - jonathansamines
谢谢,这看起来很有前途,我会进行一些测试。 - matrmawi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接