Javascript 在加载图像时替换图像

Javascript 在加载图像时替换图像,javascript,web,Javascript,Web,所以我想制作一个简单的脚本来替换网站上的图片(当然是小猫图片)。问题是,我希望脚本在我滚动浏览站点时不断替换图像 例如,在谷歌图片上,它只会加载立即加载图片的小猫图片,而不会加载之后加载的其他图片 如何使图像替换新加载的图像?我曾经考虑过检测内容负载,但不知道如何处理这个问题,因为我对网络上的一切都是新手 以下是我的content.js代码: if(document.readyState=='loading'){ 文档。addEventListener('DOMContentLoaded',替换

所以我想制作一个简单的脚本来替换网站上的图片(当然是小猫图片)。问题是,我希望脚本在我滚动浏览站点时不断替换图像

例如,在谷歌图片上,它只会加载立即加载图片的小猫图片,而不会加载之后加载的其他图片

如何使图像替换新加载的图像?我曾经考虑过检测内容负载,但不知道如何处理这个问题,因为我对网络上的一切都是新手

以下是我的content.js代码:

if(document.readyState=='loading'){
文档。addEventListener('DOMContentLoaded',替换);
}否则{
替换();
}
函数替换(){
让文件名=[
“0.jpg”,
“1.jpg”,
“2.jpg”,
“3.jpg”,
“4.jpg”,
“5.jpg”,
“6.jpg”,
“7.jpg”,
“8.jpg”,
“9.jpg”,
“10.jpg”
];
让imgs=document.getElementsByTagName('img');
用于(imgs的图像){
让ran=Math.floor(Math.random()*10);
console.log(ran);
让file='cat/'+文件名[ran];
让url=chrome.extension.getURL(文件);
image.src=url;
}
}

您可能希望查看MutationObserver对象。()

基本上,我们可以做的是,当页面修改满足一系列条件时,要求文档主体引发一个事件。在您的情况下,您希望观察子树的修改,以便在每次向页面添加更多内容时都能收到通知,然后可以查看和修改它

由于您的代码可以在一个页面上运行多次,因此您遇到了一个难题。如何处理已更改的图像?他们应该再次改变还是保留他们的新形象?我已经使用
.dataset
api()设置了一个标志,指示图像已经更改,应该在后续执行时忽略

这里有一个粗略的例子,可以让您开始学习。可以在浏览器的元素检查器中删除水平规则元素以触发该行为

<!doctype html>
<html>
<head>
<script>
"use strict";
window.addEventListener('load', onWindowLoaded, false);
function onWindowLoaded(evt)
{
    const targetNode = document.body;
    const config = {attributes:true, childList:true, subtree: true};
    
    const observer = new MutationObserver(callbackFunc);
    observer.observe(targetNode, config);
    
    function callbackFunc(mutationsList, observer)
    {
        for (const mutation of mutationsList)
        {
            if (mutation.type == 'childList')
                updateImageSources();
        }
    }
}

function updateImageSources()
{
    let allImages = document.querySelectorAll('img');
    allImages.forEach( imgFunc );
    
    function imgFunc(img, index, collection)
    {
        let filenames = ['0.jpg', '1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg',
                         '6.jpg', '7.jpg', '8.jpg', '9.jpg', '10.jpg'];
        if (img.dataset.replaced == undefined)
        {
            img.dataset.replaced = true;
            let randomIndex = Math.floor( filenames.length * Math.random() );
            img.src = filenames[randomIndex];
        }
    }
}
</script>
</head>
<body>
    <img><img><img>
    <hr>
</body>
</html>

“严格使用”;
addEventListener('load',onWindowLoaded,false);
函数onWindowLoaded(evt)
{
const targetNode=document.body;
const config={attributes:true,childList:true,subtree:true};
const observer=新的变异观察者(callbackFunc);
observer.observe(targetNode,config);
函数callbackFunc(mutationsList,observer)
{
for(突变列表的常数突变)
{
if(mutation.type=='childList')
updateImageSources();
}
}
}
函数updateImageSources()
{
让allImages=document.queryselectoral('img');
所有图像。forEach(imgFunc);
函数imgFunc(img、索引、集合)
{
让文件名=['0.jpg','1.jpg','2.jpg','3.jpg','4.jpg','5.jpg',
"6.jpg,"7.jpg,"8.jpg,"9.jpg,"10.jpg";;
if(img.dataset.replaced==未定义)
{
img.dataset.replaced=true;
让randomIndex=Math.floor(filenames.length*Math.random());
img.src=文件名[随机索引];
}
}
}


您可能希望使用
setTimeout()
clearTimeout()
函数在更改图像之前延迟多少秒。我有一个答案。这是一个我每10秒重新加载一次图片的网站。如果你认为有帮助的话,我会在下面发布代码:。@holdoffuinger,那就是每n秒替换一次图像,对吗?我想做的是在新图像加载到页面时不断替换图像。这真的很有帮助。非常感谢。