【问题标题】:Change out page content at interval based on JSON基于 JSON 间隔更改页面内容
【发布时间】:2018-08-08 01:44:31
【问题描述】:

我正在尝试使用显示静态页面内容的 CMS 创建某种“幻灯片更改”功能。我不想轮换 URL,我只想在一段时间后更改页面内容。

我使用 JSON 对象并通过 if/else 语句确定要使用的 Html 以及要使用的内容(来自 JSON)。我想知道是否有一种方法可以循环遍历 JSON 对象的每个元素一段时间?

使用这个 JSON:

[ { "pageID": "93",
   "page_type_id": "2",
   "display_id": "2",
   "slide_order": null,
   "duration": "74",
   "background_img": "images\/bg_rainbow.svg",
   "panel_id": "86",
   "panel_type_id": "2",
   "cont_id": "138",
   "contID": "138",
   "content": "\r\n\r\n\r\n<\/head>\r\n\r\nLeft 93<\/p>\r\n<\/body>\r\n<\/html>" },
 { "pageID": "93",
   "page_type_id": "2",
   "display_id": "2",
   "slide_order": null,
   "duration": "74",
   "background_img": "images\/bg_rainbow.svg",
   "panel_id": "87",
   "panel_type_id": "3",
   "cont_id": "139",
   "contID": "139",
   "content": "\r\n\r\n\r\n<\/head>\r\n\r\nRight 93<\/p>\r\n<\/body>\r\n<\/html>" 
 }]

它成功地将 2 个内容元素加载到适当的 div 中并且逻辑有效。这是一个问题:

如果我有第三个元素的 pageID 94 和不同的内容,并说我想显示第 93 页的内容 15 秒,然后在 15 秒后我想将其更改并隐藏它/显示第 94 页的内容和很快。

这可行吗?

当前脚本示例:

<script type="text/javascript">
let obj = <?php echo $showDisplays; ?>;
var leftContent = document.getElementById('leftContent');
var rightContent = document.getElementById('rightContent');

var fullColumn = document.getElementById('fullColumn');
var leftColumnQtr = document.getElementById('leftColumnQtr');
var rightColumnQtrHalf = document.getElementById('rightColumnQtrHalf');
var rightColumnQtr = document.getElementById('rightColumnQtr');
var leftColumnQtrHalf = document.getElementById('leftColumnQtrHalf');

for (var key in obj){
if(obj[key].page_type_id == 2){

    fullColumn.style.display = "none";
    leftColumnQtrHalf.style.display = "none";
    rightColumnQtrHalf.style.display = "none";
    leftColumnQtr.style.display = "none";
    rightColumnQtr.style.display = "none";


    if(obj[key].panel_type_id == 2){

        leftContent.innerHTML = obj[key].content;

    }else if(obj[key].panel_type_id == 3){

        rightContent.innerHTML = obj[key].content;
    }

}

console.log(obj);
}
</script>

【问题讨论】:

  • setInterval / setTimeout 将助您一臂之力。
  • setInterval() 被每个浏览器支持,并接受 2 个参数。第一个是带有一些要运行的命令的函数,第二个是在再次运行该函数之前要等待的时间量……再一次……再一次……SetInterval(() =&gt; { /* do some javascript here */ }, 1500)
  • @TJBlackman 所以目前在我的循环中,我可以将它设置为一个函数并让该函数与我的 if/else 一样吗?然后我可以将当​​前元素的“持续时间”值设置为我的时间,而不是硬编码时间?
  • 如果你们中的任何一个人甚至可以将一些引导逻辑或 sudo 代码作为答案,我将很乐意接受它并非常感激。我还在用 JS 弄湿我的脚

标签: javascript html json ajax


【解决方案1】:

类似这样的:

        // parse json into actual array
        // use a counter to keep track of which object we show data for
        // with each iteration of setInterval:
        //      get reference to current item, 
        //      select some DOM elements, 
        //      update HTML, repeat
        //      if on last item, go back to item 0

        const json = JSON.parse(put_json_here);
        let counter = 0; 

        setInterval(() => {
            const currentJSONObject = json[counter]; 

            fullColumn.style.display = "none";
            leftColumnQtrHalf.style.display = "none";
            rightColumnQtrHalf.style.display = "none";
            leftColumnQtr.style.display = "none";
            rightColumnQtr.style.display = "none";


            if (currentJSONObject.panel_type_id == 2){
                leftContent.innerHTML = currentJSONObject.content;
            } else if (currentJSONObject.panel_type_id == 3){
                rightContent.innerHTML = currentJSONObject.content;
            }

            counter += 1; 
            if (counter === json.length){
                counter = 0; 
            }

        }, 15000)

【讨论】:

  • 谢谢你,我认为这开始有意义了。如果我有其他基于其他 panel_types 的 if/else 语句,它仍然可以正常工作吗?因此,如果我在 JSON 中有 4 个不同的元素,它会在它们之间移动,然后在最后一个持续时间之后从第一个开始?
  • 是的,或多或少。如果您不确定代码中发生了什么,只需 console.log() 一些数据并查看您所在的位置。你应该可以让它正常工作。
  • 非常感谢,我将尝试使用其他面板类型并搞砸它。我的部分问题是 JSON 是从我的结果编码回来的,但这会将它解析为我猜的实际数组
  • 我看到的一个问题是,只要我的 JSON 只有一个页面 ID 的元素,它就可以工作,但如果有更多,它就没有,这就是为什么我最初拥有我的用 for 循环设置。我怎么能纠正呢?因此,如果前 2 个元素是 pageID 93,我会显示该内容,然后在持续时间之后,我会转到下一个 pageID 的元素?
  • 只需将 DOM 选择器移动到在 setInterval 函数内运行的函数内,这样每次函数运行时都会重新选择 dom 元素。您可能需要在函数中添加更多规则才能说出 if page === 90, get these elements, else if page === 94 get these other elements
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多