Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在第三方站点上检测javascript事件_Javascript_Javascript Events_Headless Browser - Fatal编程技术网

如何在第三方站点上检测javascript事件

如何在第三方站点上检测javascript事件,javascript,javascript-events,headless-browser,Javascript,Javascript Events,Headless Browser,是否有任何方法(实现的或理论上的)可以检测在第三方站点上分配的javascript事件和操作 如果我将javascript注入到一个外部站点,并且希望避免覆盖onsubmit、onclick、onfocus和其他类似事件,那么有没有办法检测和扩展这些回调而不是覆盖它们 我的想法是: 先在无头浏览器或javascript引擎中运行站点,以捕获所有已执行的javascript 动态解析javascript,希望第三方javascript符合我的解析器的期望 如果您只想添加新的事件处理程序而不覆盖现

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

如果我将javascript注入到一个外部站点,并且希望避免覆盖onsubmit、onclick、onfocus和其他类似事件,那么有没有办法检测和扩展这些回调而不是覆盖它们

我的想法是:

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

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

下面是一个简单的跨浏览器功能,用于添加事件:

// 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));   
        });
    }
}
我所知道的常规javascript没有跨浏览器的方式来查询现有DOM对象,以查看哪些对象通过
addEventListener
attachEvent
安装了常规javascript事件处理程序。如果事件处理程序与jQuery一起安装,则可以通过

将来还会有一些规范工作要做,以添加一个列出所有事件处理程序的属性,但我不确定它是否已经实现。你可以阅读更多关于这方面的内容

对于安装了
onclick
onsubmit
onfocus
等的事件处理程序,您可以检查所有现有的DOM元素,查看哪些元素已为这些事件分配了处理程序,然后如果需要,可以将它们挂接

// add other events here you are interested in
var events = ["onclick", "onsubmit", "onfocus", "onblur"];
var elems = document.getElementsByTagName("*"), item;
for (var i = 0; i < elems.length; i++) {
    item = elems[i];
    for (var j = 0; j < events.length; j++) {
        if (item[events[j]]) {
            console.log("event handler for " + events[j]);
        }
    }
}
//在此处添加您感兴趣的其他事件
var事件=[“onclick”、“onsubmit”、“onfocus”、“onblur”];
var elems=document.getElementsByTagName(“*”),项;
对于(变量i=0;i
如果您只想添加新的事件处理程序而不覆盖现有的事件处理程序,可以使用
addEventListener()
attachEvent()
(对于旧版本的IE),而不是设置
。onclick
。onsubmit
等。。。添加新的事件处理程序而不影响以前的事件处理程序

下面是一个简单的跨浏览器功能,用于添加事件:

// 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));   
        });
    }
}
我所知道的常规javascript没有跨浏览器的方式来查询现有DOM对象,以查看哪些对象通过
addEventListener
attachEvent
安装了常规javascript事件处理程序。如果事件处理程序与jQuery一起安装,则可以通过

将来还会有一些规范工作要做,以添加一个列出所有事件处理程序的属性,但我不确定它是否已经实现。你可以阅读更多关于这方面的内容

对于安装了
onclick
onsubmit
onfocus
等的事件处理程序,您可以检查所有现有的DOM元素,查看哪些元素已为这些事件分配了处理程序,然后如果需要,可以将它们挂接

// add other events here you are interested in
var events = ["onclick", "onsubmit", "onfocus", "onblur"];
var elems = document.getElementsByTagName("*"), item;
for (var i = 0; i < elems.length; i++) {
    item = elems[i];
    for (var j = 0; j < events.length; j++) {
        if (item[events[j]]) {
            console.log("event handler for " + events[j]);
        }
    }
}
//在此处添加您感兴趣的其他事件
var事件=[“onclick”、“onsubmit”、“onfocus”、“onblur”];
var elems=document.getElementsByTagName(“*”),项;
对于(变量i=0;i
通过更改
addEventListener
AttacheEvent
的原型,您实际上可以得到您想要的:

// 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上可能与prototype.js有冲突,不确定


您还需要检查
onclicks
和整个事件集,您可以在javascript控制台中运行
console.dir(document.createElement('a'))

您可以通过更改
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上可能与prototype.js有冲突,不确定


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

这是问题的后半部分。前半部分是在我开始将我的事件附加到第三方dom之前,了解哪些dom元素分配了事件。@DanielNill-我在回答中添加了更多信息。我必须说,你的问题并不清楚你想要这个其他部分,如果你告诉我们更多关于你真正想要完成的事情,你可能会得到更多有价值的信息来帮助我们。谢谢,你的后续行动是惊人的,正是我要找的。很抱歉,原来的问题不清楚。这是问题的后半部分。前半部分是在我开始将我的事件附加到第三方dom之前,了解哪些dom元素分配了事件。@DanielNill-我在回答中添加了更多信息。我必须说,你的问题并不清楚你想要这个其他部分,如果你告诉我们更多关于你真正想要完成的事情,你可能会得到更多有价值的信息来帮助我们。谢谢,你的后续行动是惊人的,正是我要找的。很抱歉,原来的问题不清楚。