微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法将元素动态插入 Semantic-UI Accordion

如何解决无法将元素动态插入 Semantic-UI Accordion

我正在尝试在 Semantic-UI Accordion 中插入动态内容。基本上,我必须将 JSON 输入作为手风琴呈现给 html。

这是我用于上述目的的脚本和 html:-

<script language='javascript'>

  $(document).ready(function(){
  
     $('.ui.accordion').accordion();
     
     $('.ui.accordion').accordion({onopen: function() { // function for dynamically inserting content inside clicked element in accordion
      var id = $(this).attr('id'); //gets the id of the clicked element in accordion
      var obj = find_key_value(json_data,id); // a function for finding the key in the json and its corresponding value
      for (var prop in obj){ //appends new content inside the clicked element in the accordion
        $(`#${id}`).append(`
        <div class="title">
        <i class="dropdown icon"></i>
          ${prop}
        <div class="content"></div>
        `);
        $('.ui.accordion').accordion('refresh');   
            }
          }
        });
      });
    </script>
<div class="ui styled accordion">
  <div class="title">
    <i class="dropdown icon"></i>
    A
  </div>
  <div class="content" id="A"></div>
  <div class="title">
    <i class="dropdown icon"></i>
    B
  </div>
  <div class="content" id="B"></div>
  <div class="title">
    <i class="dropdown icon"></i>
    C
  </div>
  <div class="content" id="C"></div>
</div>

同样在上面的脚本中,我使用 onopen调用于手风琴,用于在元素打开后执行一些操作,如 Semantic-UI Docs

假设json_data如下:-

json_data = {
'A' : {
     'A1':{'A12':[]},'A2': [],'A3': [],},'B' :  {
     'B1':[],'B2': [],'B3': {'B31':[]},'C' : {
     'C1':[]
      }
}

如果A被点击,则A1A2A3应该被动态插入到{{1 }} 内容A'sB 以及 C 等嵌套对象类似。因此,只有当对象对应的键被点击或打开。

Semantic-UI 上没有太多相关文档,我上面分享代码不起作用。知道如何做到这一点吗?

[编辑:此 JSON 是从 Python 字典创建的,因此它可能看起来不像常规的 JSON]

解决方法

obj.forEach((v,i,a)=>{ //appends new content inside the clicked element in the accordion
    $(`${id}`).append(`
        <div class="title">
        <i class="dropdown icon"></i>
          ${a[i]}
        <div class="content"></div>
        `);
        $('.ui.accordion').accordion('refresh');   
})
,

不是在手风琴打开时创建 html,而是在页面加载时创建整个结构。因此,首先循环遍历外部数组即:A,B,C 然后检查里面的数据假设 Aobject {} 还是 array [] 取决于这一点,您需要更改逻辑并附加整个html 在你的 dom 中。

演示代码

$(document).ready(function() {
  var json_data = {
    'A': [{
      'A1': {
        'A12': ["A12a"],'A13': ["A13a"]
      },'A2': ["az"],'A3': ["a3"],}],'B': [{
      'B1': ["b1"],'B2': ["b2"],'B3': {
        'B31': ["b31"]
      },'C': [{
      'C1': ["c1"]
    }]
  }
  var html = "";
  $.each(json_data,function(key,value) {
    //creating title for outer array
    html += `<div class="title">
        <i class="dropdown icon"></i> ${key}
      </div> <div class="content" id="${key}"><div class="accordion">`
    //child inside A,C( A1,A2..etc)
    $.each(value[0],function(k,v) {
      html += `<div class="title">
          <i class="dropdown icon"></i>
         ${k}
      </div>`
      //check if the value of object is {} or []
      if (Object.prototype.toString.call(v) === '[object Object]') {
        html += `<div class="content"><div class="accordion">`
        //i.e : A1 { A12,A13}
        for (var i = 0; i < Object.keys(v).length; i++) {
          html += `<div class="title">
          <i class="dropdown icon"></i>
         ${Object.keys(v)[i]}</div>`
          //loop through i.e : A12 :[""]
          $.each(v[Object.keys(v)[i]],function(ky,vl) {
            html += `<div class="content">${vl}</div>`
          })
        }
        html += `</div></div>`
      } else if (Object.prototype.toString.call(v) === '[object Array]') {
        //simply get content []
        html += `<div class="content">`
        $.each(v,vl) {
          html += `${vl}`
        })
        html += `</div>`
      }
    })
    html += `</div></div>`

  })

  $("#outer").html(html) //add to outer div
  $('.ui.accordion').accordion(); //intialzie


});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css" integrity="sha512-8bHTC73gkZ7rZ7vpqUQThUDhqcNFyYi2xgDgPDHc+GXVGHXq+xPjynxIopALmOPqzo9JZj0k6OqqewdGO3EsrQ==" crossorigin="anonymous" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js" integrity="sha512-dqw6X88iGgZlTsONxZK9ePmJEFrmHwpuMrsUChjAw1mRUhUITE5QU9pkcSox+ynfLhL15Sv2al5A0LVyDCmtUw==" crossorigin="anonymous"></script>
<div class="ui styled accordion" id="outer">
</div>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。