Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么.innerHTML编辑src属性?_Javascript - Fatal编程技术网

Javascript 为什么.innerHTML编辑src属性?

Javascript 为什么.innerHTML编辑src属性?,javascript,Javascript,我正在做一个chrome扩展,试图用另一个词替换某个词 let allElements = document.querySelectorAll('*'); allElements.forEach(function (element) { element.innerHTML = element.innerHTML.split(word).join("████"); } 上述代码还编辑src和srcset属性。 element.innerText和element.

我正在做一个chrome扩展,试图用另一个词替换某个词

let allElements = document.querySelectorAll('*');

allElements.forEach(function (element) {
      element.innerHTML = element.innerHTML.split(word).join("████");
}
上述代码还编辑
src
srcset
属性。
element.innerText
element.Textcontent
删除网页中的所有CSS。

不幸的是,inner/outerHTML也在更改所有子元素,这导致浏览器重新呈现它们(即使没有更改)。这也意味着您可以多次“替换”某些文本,如果您的选择器接收到来自所有级别的元素,并且替换文本也包含原始文本

因此,正确的方法是只更改文本元素,而不接触子元素。这样您就不会遇到上述任何问题:

let word = "yourword"

let allElements = document.querySelectorAll('*');
allElements.forEach(function (element) {
    element.childNodes.forEach(function(el){
        if (!el.nodeValue) return;
        el.nodeValue = el.nodeValue.split(word).join("████");
    });
});

innerHTML
从字面上看,所有包含的HTML(标记、文本、属性等)都可能需要选择文本节点。是否可行?我尝试了.innerText,但它删除了网页上的所有CSS。我也是。textContent@Gosho实际上,替换
.innerText
.textContent
会去除修改后的标记中的所有标记,当您选择on
*
时,您选择的是
标记,然后移除整个
标记。不幸的是,仅仅在
上选择也是不够的,因为这也会去除其中的任何标记。您的意思是要替换一个单词还是一个字符串?如果是一个词,你有什么规则来确定它是一个词?