Зарегистрируйте динамически созданные атрибуты тега веб-страницы с помощью пользовательского скрипта
Я могу отследить все динамически созданные теги, используя ответ Брока Адамса на "Записывать динамически созданные элементы DOM веб-страницы с помощью usercript".
Теперь я хочу получить атрибуты тегов. Я попробовал это, добавив условие if в LogNewTagCreations ()
но это не сработало.
В этом примере я проверяю атрибуты для тегов скрипта:
if(tagName=="script")
{
console.log("------------",elem.attributes.src.Value);
}
Пожалуйста, помогите мне.
1 ответ
Решение
Потому что <script>
s src
установлен вне createElement()
вызов, адаптация предыдущего скрипта требует немного больше работы, чем это. Вы должны проверить src
атрибут по существу асинхронный.
Один из способов сделать это с другим интервалом опроса. Свернув это в предыдущем скрипте (вместе с некоторым обслуживанием), код скрипта становится:
//--- 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);
if (tagName == "script") {
GetScriptAttributes (elem);
}
return elem;
}
}
function GetScriptAttributes (elem, tagNum, timerIntVar) {
/*--- Because a <script>s src or text won't be set for some while, we need
to poll for when they are added.
*/
GetScriptAttributes.tagNum = GetScriptAttributes.tagNum || 0;
if ( ! tagNum) {
GetScriptAttributes.tagNum++;
tagNum = GetScriptAttributes.tagNum;
}
if (elem.src) {
doneWaiting ();
console.log (
"Script tag", tagNum,
" has a src attribute of:", elem.src
);
}
else if (elem.textContent) {
doneWaiting ();
console.log (
"Script tag", tagNum,
" has a JS code of:", elem.textContent
);
}
else {
if ( ! timerIntVar) {
var timerIntVar = setInterval (
function () {
GetScriptAttributes (elem, tagNum, timerIntVar);
},
50
);
}
}
function doneWaiting () {
if (timerIntVar) {
clearInterval (timerIntVar);
}
}
}
/*--- 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 (GetScriptAttributes.toString() );
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);
}