2016-03-10 45 views
1

我想记录所有在JS和html中绑定的事件。我目前的解决方案,它不会记录任何内容,我做错了什么,或者有更好的方法捕获事件并保存它的回调?列出在PhantomJS中加载的页面的所有DOM事件

'use strict'; 
var page = require('webpage').create(); 

page.onConsoleMessage = function(msg) { 
    console.log('CONSOLE: ' + msg); 
}; 

page.open('url', function (status) { 
    var _count = function() { 
     return page.evaluate(function() { 
      var htmlAddEventListener = HTMLElement.prototype.addEventListener; 
      HTMLElement.prototype.addEventListener = function(name, cb) { 
       console.log('1', name); 
       this.boundEvents || (this.boundEvents = {}); 
       (this.boundEvents[name] || (this.boundEvents[name] = [])).push(cb); 
       return htmlAddEventListener.apply(this, arguments); 
      } 
      var elementAddEventListener = Element.prototype.addEventListener; 
      Element.prototype.addEventListener = function(name, cb) { 
       console.log('1', name); 
       this.boundEvents || (this.boundEvents = {}); 
       (this.boundEvents[name] || (this.boundEvents[name] = [])).push(cb); 
       return elementAddEventListener.apply(this, arguments); 
      } 
      var documentAddEventListener = Document.prototype.addEventListener; 
      Document.prototype.addEventListener = function(name, cb) { 
       console.log('2', name); 
       this.boundEvents || (this.boundEvents = {}); 
       (this.boundEvents[name] || (this.boundEvents[name] = [])).push(cb); 
       return documentAddEventListener.apply(this, arguments); 
      } 
      var windowAddEventListener = window.addEventListener; 
      window.addEventListener = function(name, cb) { 
       console.log('3', name); 
       this.boundEvents || (this.boundEvents = {}); 
       (this.boundEvents[name] || (this.boundEvents[name] = [])).push(cb); 
       return windowAddEventListener.apply(this, arguments); 
      } 

      var elementDispatchEvent = Element.prototype.dispatchEvent; 
      Element.prototype.dispatchEvent = function(name, cb) { 
       console.log('1a', name); 
       return elementDispatchEvent.apply(this, arguments); 
      } 
     }); 
    } 
    _count(); 

}); 
+0

它看起来像是订单。当我在评估结束时触发事件时,我会记录它。 – puppeteer701

回答

1

你改变各种addEventListener功能的内置对象的原型后的页面加载。在所有即时页面JavaScript运行后大部分时间调用page.open回调。如果您正在加载的页面没有使用动态请求,则不会显示任何内容。

您应该在事件处理程序中调用_count,该事件处理程序在执行页面JavaScript之前运行。示例是page.onInitialized,page.onLoadStarted,page.onNavigationRequestedpage.onUrlChanged。确保你不会多次打电话。