Журнал динамически созданных 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);
}