如何检测第三方网站上的javascript事件

时间:2012-10-02 01:02:54

标签: javascript javascript-events headless-browser

是否有任何方法(实施或仅在理论上)可以检测到在第三方网站上分配的javascript事件和操作?

如果我将javascript注入国外网站并希望避免覆盖onsubmit,onclick,onfocus和其他此类事件,有没有办法检测和扩展此类回调而不是覆盖它们?

我的想法:

  • 在无头浏览器或javascript引擎中运行该网站,然后手动捕获所有已执行的javascript
  • 动态解析javascript并希望第三方javascript符合我的解析器的期望

2 个答案:

答案 0 :(得分:3)

如果您只想添加新的事件处理程序而不覆盖现有的事件处理程序,则可以使用addEventListener()attachEvent()(对于旧版本的IE)而不是设置.onclick,{ {1}}等...添加新的事件处理程序而不影响以前的事件处理程序。

这是一个简单的跨浏览器功能来添加事件:

.onsubmit

我没有通过常规javascript来了解现有DOM对象的跨浏览器方式,以查看哪些对象通过// add event cross browser function addEvent(elem, event, fn) { if (elem.addEventListener) { elem.addEventListener(event, fn, false); } else { elem.attachEvent("on" + event, function() { // set the this pointer same as addEventListener when fn is called return(fn.call(elem, window.event)); }); } } addEventListener安装了常规javascript事件处理程序。如果使用jQuery安装事件处理程序,则可以通过this technique查询它们。

有一些未来的规范工作已经完成,以添加一个列出所有事件处理程序的属性,但我不确定它是否已实现。您可以阅读有关here的更多信息。

对于使用attachEventonclickonsubmit等安装的事件处理程序,您可以检查所有现有DOM元素,以查看哪些DOM元素具有为这些事件分配的处理程序然后,如果你愿意,可以勾住它们。

onfocus

答案 1 :(得分:0)

您可以通过更改addEventListenerattachEvent的原型实际获得所需内容:

// intercept events cross browser
var method;
if (HTMLElement.prototype.addEventListener) {
  method = 'addEventListener';
} else {
  method = 'attachEvent';
}
HTMLElement.prototype.realAddEventListener = HTMLElement.prototype[method];
HTMLElement.prototype[method] = function(a,b,c) {
  console.log('here are all the events being added:', arguments);
  this.realAddEventListener(a,b,c);
};

当然,重要的是在任何其他页面脚本之前将其添加到页面中,但它可以在jQuery之类的库之前或之前出现,但可能在prototype.js原型上存在冲突,不确定。

您还需要检查onclicks以及您可以通过在javascript控制台中运行console.dir(document.createElement('a'))找到的整个事件集。