Mutation Observer脚本报错:参数1非Node类型,求原因及解决
解决MutationObserver的类型错误问题
嘿,我明白你作为非开发者遇到这个报错有多头疼,咱们一步步来搞定它!
错误原因
你控制台里的Uncaught TypeError是因为:document.getElementsByTagName('img')返回的是一个HTMLCollection(元素集合),而MutationObserver.observe()方法要求第一个参数必须是单个Node节点或者NodeList列表,直接传这个集合就会触发类型不匹配的错误。
修复方案
我们可以换个更高效的方式:监听包含所有img的父元素(比如你代码里等待的#browser元素),同时开启subtree: true配置,这样就能监控父元素下所有img的属性变化了。另外,我们还可以优化你的逻辑,只在src被改成错误值时才替换,避免不必要的操作。
修改后的完整脚本:
function initMod(){ // 等待#browser元素加载完成 if(!document.querySelector("#browser")){ setTimeout(initMod, 1000); return; } // 监听#browser元素(所有img的父容器) var targetNode = document.querySelector("#browser"); // 配置:仅监听src属性变化,包含子树所有元素 var config = { attributes: true, childList: false, subtree: true, characterData: false, attributeFilter: ['src'] }; var callback = function(mutationsList, observer) { for(var mutation of mutationsList) { const imgElement = mutation.target; // 检查当前src是不是被改成了错误的地址 if (imgElement.src === 'https://hyperspace.marquiskurt.net/icons/favicon-32x32.png') { // 换回正确的src imgElement.src = 'chrome://favicon/https://hyperspace.marquiskurt.net/app/'; console.log('已修复img的src地址'); } } }; var observer = new MutationObserver(callback); observer.observe(targetNode, config); } initMod();
改动说明
- 把监听对象换成了
#browser元素,这是你原本就在等待的容器,所有目标img应该都在它的子树中 - 给config加上了
attributeFilter: ['src'],只监听src属性的变化,减少不必要的触发 - 移除了
getElementsBySrc函数,直接通过mutation.target获取变化的元素,逻辑更简洁精准 - 只在检测到错误src时才执行替换操作,避免重复修改
这样修改后,脚本就能正常运行,不会再报类型错误,而且能精准修复被篡改的img src啦!
内容的提问来源于stack exchange,提问作者Gnosis
相关产品推荐
相关产品推荐

