Что вызывает эту ошибку в моем наблюдателе мутаций при использовании скрипта? - PullRequest
0 голосов
/ 19 марта 2019

На исходный вопрос был дан ответ .Кроме того, кто-то за пределами Stackoverflow предоставил полное решение того, чего я пытался достичь с помощью своего сценария, который я добавил в качестве ответа на мой вопрос.Сам скрипт и краткое описание конкретной проблемы, которую он решает, подробно изложены в моем собственном ответе.

Оригинальный вопрос:

Я, к сожалению, не программист, поэтомумой опыт очень ограничен.

Мой браузер перезаписывает правильный img src с неправильным src через несколько секунд после его запуска.

Функция, предназначенная для моего сценария, - это работа- чтобы немедленно заменить сломанный src на правильный src снова, когда мой браузер перезаписывает правильный src.

function getElementsBySrc(srcValue) {
  var nodes = [];
  var e = document.getElementsByTagName('img');

  for (var i = 0; i < e.length; i++) {
    if (e[i].hasAttribute('src') && e[i].getAttribute('src') == srcValue) {
      nodes.push(e[i]);
    }
  }

  return nodes;
}

function initMod(){
    if(!document.querySelector("#browser")){
        setTimeout(initMod, 1000);
        return;
    }

var targetNode = document.getElementsByTagName('img');
var config = { attributes: true, childList: false, subtree: false, characterData: false };

var callback = function(mutationsList, observer) {
    for(var mutation of mutationsList) {
        if (mutation.type == 'attributes') {

            console.log('The ' + mutation.attributeName + ' attribute was modified.');

            var n = getElementsBySrc('https://hyperspace.marquiskurt.net/icons/favicon-32x32.png');
            for (var i = 0; i < n.length; i++) {
                n[i].setAttribute('src', 'chrome://favicon/https://hyperspace.marquiskurt.net/app/');
            }

        }
    }
};

var observer = new MutationObserver(callback);

observer.observe(targetNode, config);

}
initMod();

Сценарий загружается непосредственно при запуске моего браузера.My Chrome Devtools Console выдает ошибку:

Uncaught TypeError: Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'.

Ответы [ 2 ]

1 голос
/ 19 марта 2019

при document.getElementsByTagName('img'); возвращает список элементов, а не узел, вы не можете использовать targetNode (потому что это не узел)

Здесь явместо этого используется document.querySelectorAll, тот же результат, но у него есть метод forEach, который я использую для создания наблюдателей мутаций для каждого IMG

function initMod() {
    if(!document.querySelector("#browser")){
        setTimeout(initMod, 1000);
        return;
    }

    const callback = (mutationsList, observer) => {
        for(let mutation of mutationsList) {
            if (mutation.type == 'attributes') {
                console.log('The ' + mutation.attributeName + ' attribute was modified.');
                const n = getElementsBySrc('https://hyperspace.marquiskurt.net/icons/favicon-32x32.png');
                for (let e of n) {
                    e.setAttribute('src', 'chrome://favicon/https://hyperspace.marquiskurt.net/app/');
                }
            }
        }
    };
    const config = { attributes: true, childList: false, subtree: false, characterData: false };
    document.querySelectorAll('img').forEach(targetNode => {
        const observer = new MutationObserver(callback);
        observer.observe(targetNode, config);
    });
}
0 голосов
/ 19 марта 2019

Кто-то очень любезно предоставил решение, которое дало именно то, что я пытался сделать.

const selector = "#panels img[src='https://hyperspace.marquiskurt.net/icons/favicon-32x32.png']";
function fixImages() {
    const maybeBadImage = document.querySelector(selector);
    if(maybeBadImage){
        maybeBadImage.src = "chrome://favicon/https://hyperspace.marquiskurt.net/app/";
    }
}
const observer = new MutationObserver(fixImages);
function initMod() {
    if(!document.querySelector(selector)){
        setTimeout(initMod, 0);
        return;
    }
    observer.observe(document.querySelector(selector), { attributes: true });
    fixImages();
}
initMod();

Если для setTimeout установлено значение 0, поврежденный src немедленно исправляется без каких-либо визуальных изменений, которые может видеть пользователь. Этот сценарий можно изменить для использования, если у кого-то еще возникла проблема, когда веб-браузер Vivaldi неправильно изменяет src для значка определенной веб-панели, добавленной пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...