javascript - 使用用户脚本记录网页动态创建的 DOM 元素

标签 javascript dom userscripts

我想使用用户脚本从网页中提取所有动态 JavaScript 函数。

有人建议对 DOM 对象使用钩子(Hook)。他们还提供了这个例子:

var f = document.createElement;document.createElement = function(tagName){ 
console.log(tagName); 
f.apply(document, arguments); }


我认为这个函数会记录所有 document.createElement() 调用, 但是我应该在我的用户脚本中哪里添加这个函数?
我尝试创建一个仅包含此函数的用户脚本,但它不起作用。

页面加载后执行用户脚本。如何更改此函数以便它预先跟踪动态函数?

最佳答案

要“事先”跟踪所有动态加载的参数,请使用 // @run-at document-start .

此外,您必须将代码注入(inject)目标页面,因为您要跟踪的是该页面的 javascript。

这是一个记录所有 createElement() 调用的完整脚本。它适用于 Greasemonkey (Firefox) 和 Chrome 用户脚本:

// ==UserScript==
// @name        _Track dynamically added elements
// @namespace   Your PC
// @include     http://YOUR_SERVER/YOUR_PATH/*
// @run-at      document-start
// ==/UserScript==

//--- Intercept and log document.createElement().
function LogNewTagCreations () {
    var oldDocumentCreateElement    = document.createElement;

    document.createElement          = function (tagName) {
        var elem = oldDocumentCreateElement.apply (document, arguments);
        console.log ("Dynamically created a(n)", tagName, " tag.  Link: ", elem);
        return elem;
    }
}

/*--- The userscript or GM script will start running before the DOM is available.
    Therefore, we wait...
*/
var waitForDomInterval = setInterval (
    function () {
        var domPresentNode;
        if (typeof document.head == "undefined")
            domPresentNode = document.querySelector ("head, body");
        else
            domPresentNode = document.head;
        if (domPresentNode) {
            clearInterval (waitForDomInterval);
            addJS_Node (null, null, LogNewTagCreations);
        }
    },
    1
);

//--- Handy injection function.
function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

关于javascript - 使用用户脚本记录网页动态创建的 DOM 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10083010/

相关文章:

java - 在保留 xsi :type 的同时合并文档

javascript - 如何修改 Stumbleupon URL 并提供指向内容页面的直接链接?

javascript - 在 Tampermonkey 中模拟 mousedown、click、mouseup 序列?

javascript - Backbone.js - 让 json 数据进入 View

javascript - 在使用 Marionette 渲染的两个模板之间进行选择

javascript - 获取 jQuery UI Datepicker 的高度和宽度

javascript - 是否可以在不循环的情况下在其父节点中获取元素的数字索引?

java - 包含多个根元素的 XML 文件

greasemonkey - 在页面上下文中使用用户脚本 GM_functions

javascript - 如何在 Javascript 中出现错误时中断