是否有任何方法(实施或仅在理论上)可以检测到在第三方网站上分配的javascript事件和操作?
如果我将javascript注入国外网站并希望避免覆盖onsubmit,onclick,onfocus和其他此类事件,有没有办法检测和扩展此类回调而不是覆盖它们?
我的想法:
答案 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的更多信息。
对于使用attachEvent
,onclick
,onsubmit
等安装的事件处理程序,您可以检查所有现有DOM元素,以查看哪些DOM元素具有为这些事件分配的处理程序然后,如果你愿意,可以勾住它们。
onfocus
答案 1 :(得分:0)
您可以通过更改addEventListener
和attachEvent
的原型实际获得所需内容:
// 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'))
找到的整个事件集。