javascript - jQuery 在间隔函数内对 DOM 的更改不会保留

标签 javascript jquery html dom

我正在尝试构建一个广告系统,它每秒检查一次可用的新广告,并仅在前一个广告显示完毕后才显示这些广告。 (每个广告都有一个名为“时间”的属性,用于指定应显示的秒数)

我使用“setInterval()”实现了该程序,只要有空位,我就会使用“.load()”加载广告模板,使用“.html”将文本和图像更改为广告的文本和图像()' 和 '.attr("src",...)'。

运行文件时,广告(目前只有一个)显示一秒钟(应该是四秒钟),然后 DOM 恢复为“template.html”中的原始文本和图像。此操作会无限执行,而每四秒广告会显示一次,短暂一瞥,然后恢复 DOM。

我在这里阅读了很多关于类似问题的帖子,但没有一个提供针对这个特定问题的解决方案。

这是存储广告对象的播放列表:

{name: "msg1",
 texts: {txt1: "First ad!",
         txt2: "Come and buy our product!",
         txt3: "It's top secret...",
         txt4: "So it has to be good ;)"},
 images: {img1: "./topSecret.png",
          img2: "http://in5d.com/wp-content/uploads/2015/03/zdhstrrst.jpg"}}

这是使用 jQuery 在一个时间间隔内发生的 DOM 变化:

$(document).ready(function(){
    var iterator = 0;
    var count = 1;
    setInterval(function(){
        count--;
        var infiniteLoopPreventor = playlist.length;
        while(infiniteLoopPreventor >0 && count == 0){ //make sure no infinite loop and no previous msg is being displayed
            var now = new Date();
            var currentMsg = playlist[iterator];
            for(var timeSet in currentMsg.timeSets){
                if(currentMsg.timeSets[timeSet].startDate.getTime()<=now.getTime() &&
                    currentMsg.timeSets[timeSet].endDate.getTime()>=now.getTime() &&
                currentMsg.timeSets[timeSet].days[now.getDay()] == 1 &&
                currentMsg.timeSets[timeSet].startTime<=now.getHours() &&
                currentMsg.timeSets[timeSet].endTime>=now.getHours()){
                    //display message
                $( "#result" ).load( currentMsg.template );
                for(var txt in currentMsg.texts){
                    $( "div#"+txt ).html(currentMsg.texts[txt]);
                }
                for(var img in currentMsg.images){
                    $( "img#"+img ).attr("src", currentMsg.images[img]);
                }
                count = currentMsg.time;
                break; //from the for loop which iterates over time sets.
            }   
        }
        iterator = ( iterator + 1 ) % playlist.length;
        infiniteLoopPreventor--;
    }
}, 1000);
});

滚动浏览询问类似问题的帖子,就出现问题的原因提出了一些建议,但没有提供适当的解决方案。提议的原因是: - 更改不会保留,因为 html 是从另一个页面加载的。 - 异步函数。 - 间隔问题,可以通过使用不适合我的问题的 clearInterval() 来解决,因为我不希望在任何给定时间停止间隔。

非常感谢您的见解。

最佳答案

我终于找到了解决办法!

问题出在 .html() 和 .attr() 上。

我更改了代码,以便将它们作为 .load() 回调函数的一部分执行并且它起作用了。

我仍然希望能解释为什么旧版本不起作用。同时,这是新的代码:

$( "#result" ).load( currentMsg.template, function(){
    for(var txt in currentMsg.texts){
        $("div#"+txt ).html(currentMsg.texts[txt]);
    }
    for(var img in currentMsg.images){
        $( "img#"+img ).attr("src", currentMsg.images[img]);
    }
} );

关于javascript - jQuery 在间隔函数内对 DOM 的更改不会保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41196463/

相关文章:

javascript - 如何在html2canvas中将dom下载为svg?

javascript - 当覆盖 div 可见时,如何停止滚动页面?

javascript - Quill 在 h1 之后添加了一个不需要的 <br>

javascript - 如何在页面刷新时删除 key 为某个字符 "abc"的所有 session 存储?

python - 对 html 文件中使用的变量调用 jsonify 渲染不正确

html - 将段落内的文本 "figure x"设为粗体

javascript - 允许 Enyo 中的工具提示包含 HTML 内容

php - 上传文件,表格中的表格

Jquery数据函数从字符串的开头删除零

javascript - $(this).attr ("id") 不工作