Журнал динамически созданных DOM-элементов веб-страницы с помощью usercript

Я хочу извлечь все динамические функции JavaScript из веб-страницы с помощью пользовательского сценария.

Кто-то предложил использовать хук для объектов DOM. Они также предоставили этот пример:

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


Я думаю, что эта функция регистрирует все document.createElement() звонки, но где я могу добавить эту функцию в свой пользовательский скрипт?
Я попытался создать usercript, который содержит только эту функцию, но она не сработала.

Пользовательский скрипт выполняется после загрузки страницы. Как можно изменить эту функцию, чтобы она отслеживала динамические функции заранее?

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);
}
Другие вопросы по тегам