Невозможно прочитать свойство 'innerHTML' из null на страницах Википедии - PullRequest
1 голос
/ 22 мая 2019

Я не разработчик JS, поэтому простите за любой ужасный код, который я мог бы написать

Привет всем,

Я работаю над этим проектом расширения Chrome, и у меня действительно странная ошибка. Расширение предназначено для просмотра веб-страницы и замены определенных слов. Кажется, он отлично работает на всех сайтах, которые я пробовал, кроме Википедии. В википедии заменяются только слова в первом абзаце страницы, а затем появляется ошибка Uncaught TypeError: Cannot read property 'innerHTML' of null.

Content.js

var nodes = [];
var wordMap = {'color':'colour'}
var regex = new RegExp(Object.keys(wordMap).join("|"),"gi");

if( document.readyState !== 'loading' ) {
    console.log( 'document is already ready, just execute code here' );
    myInitCode();
} else {
    document.addEventListener('DOMContentLoaded', function () {
        console.log( 'document was not ready, place code here' );
        myInitCode();
    });
}

function myInitCode() {
    var walker = document.createTreeWalker(
    document.body,
    NodeFilter.SHOW_TEXT,
    function(node) {
        var matches = node.textContent.match(regex);

        if(matches) { 
            return NodeFilter.FILTER_ACCEPT;
        } else {
            return NodeFilter.FILTER_SKIP;
        }
    },
    false);

    while(walker.nextNode()) {
        nodes.push(walker.currentNode);
    }

    for(var i = 0; node=nodes[i] ; i++) {
        node.parentNode.innerHTML = node.parentNode.innerHTML.replace(regex, function(match) {
            return wordMap[match];
        });
    }
}

Раздел сценария содержимого Manifest.json

"content_scripts": [
    {
        "matches": [
            "*://*/*"
        ],
        "js": [
            "content.js"
        ],
        "run_at": "document_end" 
    }
]

Вот снимок экрана с ошибкой: enter image description here

А вот скриншот ошибки: enter image description here

Я пытался искать ответы, и думал, что ошибка происходит, потому что DOM еще не загружен, поэтому я добавил код для решения этой проблемы, но ошибка все еще происходит. Есть идеи, почему это может происходить?

Спасибо!

1 Ответ

0 голосов
/ 22 мая 2019

Как отмечает @IsaacVidrine в комментариях к вопросу, ошибка вызвана тем, что node не имеет parentNode.Чтобы исправить это, проверьте наличие parentNode в цикле for следующим образом:

for(var i = 0; node=nodes[i] ; i++) {
        if(node.parentNode){
            node.parentNode.innerHTML = node.parentNode.innerHTML.replace(regex, function(match) {
                return wordMap[match];
            });
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...