Javascript 无法读取属性';innerHTML';Wikipedia页面上的空值
我不是JS开发人员,所以请原谅我可能编写的任何可怕的代码 大家好 我正在做这个chrome扩展项目,我遇到了一个非常奇怪的错误。该扩展旨在浏览网页并替换某些单词。除了维基百科,我尝试过的所有网站似乎都很好用。在wikipedia上,只有页面第一段中的单词被替换,然后我得到一个Javascript 无法读取属性';innerHTML';Wikipedia页面上的空值,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我不是JS开发人员,所以请原谅我可能编写的任何可怕的代码 大家好 我正在做这个chrome扩展项目,我遇到了一个非常奇怪的错误。该扩展旨在浏览网页并替换某些单词。除了维基百科,我尝试过的所有网站似乎都很好用。在wikipedia上,只有页面第一段中的单词被替换,然后我得到一个uncaughttypeerror:cannotreadproperty'innerHTML'的null错误抛出 Content.js var nodes = []; var wordMap = {'color':'colo
uncaughttypeerror:cannotreadproperty'innerHTML'的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"
}
]
以下是发生错误的屏幕截图:
下面是错误的屏幕截图:
我试着四处寻找答案,我认为发生错误是因为DOM还没有加载,所以我添加了代码来解决这个问题,但错误仍然发生。
你知道为什么会这样吗
谢谢大家! 正如@IsaacVidrine在对问题的评论中指出的,错误是由
节点
没有父节点
引起的。要修复此问题,请检查for循环中是否存在parentNode
,如下所示:
for(var i = 0; node=nodes[i] ; i++) {
if(node.parentNode){
node.parentNode.innerHTML = node.parentNode.innerHTML.replace(regex, function(match) {
return wordMap[match];
});
}
}
正如@IsaacVidrine在对问题的评论中指出的,错误是由
节点
没有父节点
引起的。要修复此问题,请检查for循环中是否存在parentNode
,如下所示:
for(var i = 0; node=nodes[i] ; i++) {
if(node.parentNode){
node.parentNode.innerHTML = node.parentNode.innerHTML.replace(regex, function(match) {
return wordMap[match];
});
}
}
无法访问的内容是否在iframes中?意味着
节点
对象上不存在父节点
。。。只需做一个检查并说if(node.parentNode)
我想您可以调试哪个节点的parentNode为null<代码>如果(!node.parentNode)调试器代码>@IsaacVidrine是的,很好地发现了。我真傻@Archer for循环没有问题,请自己测试。无法访问的内容是否在iframes中?表示节点
对象上不存在父节点
。。。只需做一个检查并说if(node.parentNode)
我想您可以调试哪个节点的parentNode为null<代码>如果(!node.parentNode)调试器代码>@IsaacVidrine是的,很好地发现了。我真傻@阿切尔:for循环没有问题,自己测试一下。