【问题标题】:AJAX calls - dynamic JSON db array - to hide HTML elements - with CSS visibility propertyAJAX 调用 - 动态 JSON 数据库数组 - 隐藏 HTML 元素 - 具有 CSS 可见性属性
【发布时间】:2020-04-02 14:18:56
【问题描述】:

我是一个超级兴奋的新手,坚持这一点;在任何地方都找不到这个,请帮助:

如何让 var dotContainer 成为 JSON DB 中的所有 id,以便使用 CSS“dot-hide”属性(仅适用于“n788”这个属性)使所有匹配的 HTML id 元素不可见用 getElementById 指定的 id)。

因此,使用新 id 值(如 n790 或 n786)动态更新的 JSON 数据库将使用 CSS“dot-hide”异步隐藏匹配的 HTML id 元素点。

JavaScript

var dotContainer = document.getElementById("n788"); //THIS TO CONTAIN ALL ID VALUES FROM THE JSON DB
    var dataRequest = new XMLHttpRequest();
    dataRequest.open('get', 'https://raw.githubusercontent.com/sicronerver/sicronerve/master/dbn.json');
    dataRequest.onload = function() {
        var ourData = JSON.parse(dataRequest.responseText);
        //setInterval(function(){ 
            renderdata(ourData);
        //}, 1000);      
    };
dataRequest.send(); {
    }
function renderdata(dataobjectarray) {
        var texString = ""
        for (i = 0; i < dataobjectarray.length; i++) {
            texString += dataobjectarray[i].id + ",";
        }
  dotContainer.insertAdjacentText('afterEnd', texString); //REFERENCE OF JSON ID VALUES TO HIDE HTML ID ELEMENTS
  dotContainer.classList.add("dot-hide");
}

JSON

[{"id":"n787"},{"id":"n788"},{"id":"n789"}]

HTML

<div class="grid">
  <a id = "n786" class = "dot" href="#786"></a>  
  <a id = "n787" class = "dot" href="#787"></a>  
  <a id = "n788" class = "dot" href="#788"></a>  
  <a id = "n789" class = "dot" href="#789"></a>
  <a id = "n790" class = "dot" href="#790"></a>

CSS

.dot-hide {
  visibility: hidden;
  opacity: 0;
  transform: scale(.75);
}

.grid {
  display: grid;
  grid-template-columns: repeat(16, 1fr);
  grid-template-rows: repeat(9, 1fr);
}

.dot {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background-color: #777777;
}

.dot:hover {
  background-color: rgb(60, 255, 0);
  opacity: 50%;
}

.dot:active {
  background-color: #ff0000;
  opacity: 50%;
}

#n786 {
  position: relative;
  grid-column: 3 / span 2;
  grid-row: 6 / span 2;
}

#n787 {
  position: relative;
  grid-column: 6 / span 2;
  grid-row: 6 / span 2;
}

#n788 {
  position: relative;
  grid-column: 9 / span 2;
  grid-row: 6 / span 2;
}

#n789 {
  position: relative;
  grid-column: 12 / span 2;
  grid-row: 6 / span 2;
}

#n790 {
  position: relative;
  grid-column: 15 / span 2;
  grid-row: 6 / span 2;
}

我在这里做了一支笔:https://codepen.io/andijonson/pen/gOpEmEQ

非常感谢,安迪

【问题讨论】:

    标签: javascript html css json ajax


    【解决方案1】:

    您必须添加和删除 css。

    示例:

    var dotContainer = document.getElementById("n788"); //THIS TO CONTAIN ALL ID VALUES FROM THE JSON DB
    var dataRequest = new XMLHttpRequest();
    dataRequest.open(
      "get",
      "https://raw.githubusercontent.com/sicronerver/sicronerve/master/dbn.json"
    );
    dataRequest.onload = function() {
      var ourData = JSON.parse(dataRequest.responseText);
      //setInterval(function(){
      renderdata(ourData);
      //}, 1000);
    };
    dataRequest.send();
    
    function renderdata(dataobjectarray) {
      document.querySelectorAll("div a").forEach(x => {
        x.className = "dot";
      });
      var texString = "";
      for (i = 0; i < dataobjectarray.length; i++) {
        texString += dataobjectarray[i].id + ",";
      }
      dotContainer.insertAdjacentText("afterEnd", texString);
    }
    

    演示:

    window.onload = () => {
      function fetchData() {
        fetch(
          "https://raw.githubusercontent.com/sicronerver/sicronerve/master/dbn.json"
        )
          .then(res => res.json())
          .then(renderdata);
      }
      function renderdata(data) {
        document.querySelectorAll("div a").forEach(x => {
          x.classList.remove("hide");
        });
        data.forEach(item => {
          const elm = document.getElementById(item.id);
          elm.classList.add("hide");
        });
      }
      function start() {
        setInterval(fetchData, 2000);
      }
      start();
    };
    .hide {
      visibility: hidden;
      opacity: 0;
    }
    
    .grid {
      display: grid;
      grid-template-columns: repeat(16, 1fr);
      grid-template-rows: repeat(9, 1fr);
    }
    
    .dot {
      width: 40px;
      height: 40px;
      border-radius: 50%;
      background-color: #777777;
    }
      
    .dot:hover {
      background-color: rgb(60, 255, 0);
      opacity: 50%;
    }
      
    .dot:active {
      background-color: #ff0000;
      opacity: 50%;
    }
    
    #n786 {
      position: relative;
      grid-column: 3 / span 2;
      grid-row: 6 / span 2;
    }
    
    #n787 {
      position: relative;
      grid-column: 6 / span 2;
      grid-row: 6 / span 2;
    }
    
    #n788 {
      position: relative;
      grid-column: 9 / span 2;
      grid-row: 6 / span 2;
    }
    
    #n789 {
      position: relative;
      grid-column: 12 / span 2;
      grid-row: 6 / span 2;
    }
    
    #n790 {
      position: relative;
      grid-column: 15 / span 2;
      grid-row: 6 / span 2;
    }
    <div class="grid">
        <a id="n786" class="dot" href="#"></a>
        <a id="n787" class="dot" href="#"></a>
        <a id="n788" class="dot" href="#"></a>
        <a id="n789" class="dot" href="#"></a>
        <a id="n790" class="dot" href="#"></a>
    </div>

    【讨论】:

    • 完美,非常感谢!有没有一种简单的异步运行方法——这样当 json 数据库发生变化时,相关的点将被隐藏而无需刷新页面。我试过setInterval,但它只写了已经加载到控制台的内容。非常感谢,安迪
    • 我把你很好的答案打了绿色,谢谢!如果您对异步方面有答案,我将不胜感激,因为我知道这是一个单独的问题!非常感谢安迪
    • 你什么时候想取??一些间隔??
    • 我以为每一秒?
    • 除非有另一种方法可以检查数据库何时更新,因此无需刷新页面即可异步更改。 PS 我是新手,还在学习 =) 非常感谢!
    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多