【问题标题】:Log a web page's dynamically-created, DOM elements with a userscript使用用户脚本记录网页的动态创建的 DOM 元素
【发布时间】:2012-04-10 04:10:02
【问题描述】:

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

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

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


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

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

【问题讨论】:

    标签: javascript dom userscripts


    【解决方案1】:

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

    此外,您必须将代码注入目标页面,因为您要跟踪该页面的 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);
    }
    

    【讨论】:

    • 非常感谢你能更清楚地解释一下我写了这个用户脚本并将它安装在 Firefox 中,但是 Web 控制台上没有打印任何内容,你能帮我解决这个问题吗
    • 您是否将http://YOUR_SERVER/YOUR_PATH/* 更改为对您感兴趣的网站有意义的值?您使用的是什么版本的 Greasemonkey。如果页面实际上并未动态创建节点,则脚本不会记录任何内容。链接到目标页面。
    • 我希望我查看的每个网站都使用这个,我可以删除@include
    • 谢谢它正在工作。从过去的 4 天开始,我只是想这样做,你让我的工作变得轻松,非常感谢
    • 我正在尝试从上述函数中检索属性值,如下所示我可以这样做if(tagName=="script") { console.log("------------",elem.attributes.src.Value); }
    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2016-08-11
    相关资源
    最近更新 更多