首页 > 解决方案 > 如何从我的多选框中选择一个选项并更新我的图表?

问题描述

我第一次使用 html、css、jquery 等。我已经成功实现了一个多选下拉菜单。我希望我的多选来更新我的图表。示例:如果我在多选下拉列表中单击 du 和 li,图表应仅显示这些值和图例。我应该看不到 Mrd。这是我的代码:

var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
    type:'line',
    data : {

    labels: [10,20,30,40,50,60],
    datasets : [{
      label:'Du',
      data:[
        3,
        6,
        10,
        12,
        19,
        25
      ],
      backgroundColor:'pink',
      borderWidth:4,
      borderColor:'#777',
      hoverBorderWidth:3,
      hoverBorderColor:'#000'

    },{
      label:'Lt',
      data:[
        14,
        28,
        80,
        20,
        60,
        45
      ],
      backgroundColor:'yellow',
      borderWidth:4,
      birderColor:'black',
      hoverBorderWidth:3,
      hoverBorderColor:'#000'

    },{
      label:'Mrd',
      data:[
        16,
        18,
        28,
        45,
        60,
        80
        ],
      backgroundColor:'orange',
      borderWidth:4,
      birderColor:'black',
      hoverBorderWidth:3,
      hoverBorderColor:'#000'

    }],

    },
    options:{
      title:{
        display:true,
        text:'Defects',
        fontSize:15
      },
      legend:{
        position:'bottom',
        labels:{
          fontColor:'red'
        }

    },
      layout:{
        padding:{
          left:50,
          right:0,
          top:0,
          bottom:0
        }
      },
      tooltips:{
        enabled:true
      }
    }
});
$('#dataset').on('change', function(){
  if(this.value=="1"){
   myChart.data.datasets[0].data=[   3,
                              6,
                              10,
                              12,
                              19,
                              25]
   myChart.data.datasets[1].data = $('dataset').empty();
   myChart.data.datasets[2].data = [16,
                              18,
                              28,
                              45,
                              60,
                              80],
    myChart.update();
  }else if(this.value=="2"){
    myChart.data.datasets[0].data = $('dataset').empty();
    myChart.data.datasets[1].data = [ 14,
                            28,
                            80,
                            20,
                            60,
                            45];
    myChart.data.datasets[2].data = [   16,
                            18,
                            28,
                            45,
                            60,
                            80

    ]

    myChart.update();
  }else if(this.value=="3"){
    myChart.data.datasets[0].data=[3,
                            6,
                            10,
                            12,
                            19,
                            25];
    myChart.data.datasets[1].data=[14,
                            28,
                            80,
                            20,
                            60,
                            45];
        myChart.data.datasets[2].data = $('dataset').empty();

    myChart.update();
  }
});
$('#langOpt').multiselect({
  columns:1,
  placeholder:'Select Defects'
});
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>
        Defect Charts
    </title>
    <meta name="viewport" content="width=device-width, inital-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js" ></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.bundle.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.bundle.min.js"></script>

    <!-- jQuery library -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

    <!-- JS & CSS library of MultiSelect plugin -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-multiselect/0.9.13/js/bootstrap-multiselect.js"></script>
    <script src="multiselect/jquery.multiselect.js"></script>
    <link rel="stylesheet" href="multiselect/jquery.multiselect.css">
  </head>
<div class="container-fluid">
  <div class="row">
    <div class="col-4">
      <div class="form-group mt-3 mb-3">
        <label for="dataset">Select Factor</label>
        <select class="form-control" id="dataset">
          <option id="opt1" value="1">Low</option>
          <option id="opt2" value="2">Medium</option>
          <option id="opt3" value="3">High</option>
        </select>
      </div>
    </div>
  </div>
</div>
<div class="col-4"></div>
  <div class="row">
    <div class="col"></div>
    <div class="col-8">
      <div id="chart-wrapper">
        <canvas id="myChart"></canvas>
      </div>
      <div class="container">
        <h4>Multi-Select Defect</h4>
        <div class="row">
          <div class="col-4"></div>
          <select name="langOpt[]" multiple id="langOpt">
            <option value ="Du">Dust</option>
            <option value ="Lt">Lint</option>
            <option value ="Mrd">Manual Rundown</option>
          </select>
        </div>
      </div>
    </div>
  </div>
</html>

标签: javascripthtmljquerycss

解决方案


你在那里做得很好。

我正在将以下代码添加到您的代码中。

$('.multiselect-container.dropdown-menu').on('change', function(){
  var selectedDefect = $('.multiselect-container.dropdown-menu > li.active');
  if(selectedDefect.length > 0){
    selectedDefect.each(function(){
      console.log($(this).find('input').val());
    });
  }

});

因此,使用我在 console.log 中输入的内容,您应该能够像之前在 JS 中所做的那样过滤您希望显示或不显示的数据。因此,您需要从其他选定的值中保存选定的值并过滤它们。

您还需要在我的 if 之后添加 else 以确保当没有 li 具有 class="active" 时,它会显示整个图表。

如果你希望我可以继续,但从这里你应该能够根据你所做的来赶上。

var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
    type:'line',
    data : {

    labels: [10,20,30,40,50,60],
    datasets : [{
      label:'Du',
      data:[
        3,
        6,
        10,
        12,
        19,
        25
      ],
      backgroundColor:'pink',
      borderWidth:4,
      borderColor:'#777',
      hoverBorderWidth:3,
      hoverBorderColor:'#000'

    },{
      label:'Lt',
      data:[
        14,
        28,
        80,
        20,
        60,
        45
      ],
      backgroundColor:'yellow',
      borderWidth:4,
      birderColor:'black',
      hoverBorderWidth:3,
      hoverBorderColor:'#000'

    },{
      label:'Mrd',
      data:[
        16,
        18,
        28,
        45,
        60,
        80
        ],
      backgroundColor:'orange',
      borderWidth:4,
      birderColor:'black',
      hoverBorderWidth:3,
      hoverBorderColor:'#000'

    }],

    },
    options:{
      title:{
        display:true,
        text:'Defects',
        fontSize:15
      },
      legend:{
        position:'bottom',
        labels:{
          fontColor:'red'
        }

    },
      layout:{
        padding:{
          left:50,
          right:0,
          top:0,
          bottom:0
        }
      },
      tooltips:{
        enabled:true
      }
    }
});

$('#dataset').on('change', function(){

  var selectedDefect = $('.multiselect-container.dropdown-menu > li.active');
  if(selectedDefect.length > 0){
      var defect = false;
      var defect2 = false;
      var defect3 = false;
    selectedDefect.each(function(){
      
      if($(this).find('input').val() == "Du"){
        defect = true;
      }
      if($(this).find('input').val() == "Lt"){
        defect2 = true;
      }
      if($(this).find('input').val() == "Mrd"){
        defect3 = true;
      }
    });
      
      dataSet2($('#dataset').val(), defect, defect2, defect3);
    } else{
      dataSet($('#dataset').val());
    }
  
  // This will add a selected attribute on the option you choose
  $("#dataset").val(this.value)
  .find("option[value=" + this.value +"]").attr('selected', true);
  
});

$('#langOpt').multiselect({
  columns:1,
  placeholder:'Select Defects'
});

$('.multiselect-container.dropdown-menu').on('change', function(){
  var selectedDefect = $('.multiselect-container.dropdown-menu > li.active');
  var factorSelected = 1; //Set basicly Low
  if($('#dataset > option:selected').length > 0){
    factorSelected = $('#dataset > option:selected').val();
  }
  
  if(selectedDefect.length > 0){
      var defect = false;
      var defect2 = false;
      var defect3 = false;
    selectedDefect.each(function(){
      if($(this).find('input').val() == "Du"){
        defect = true;
      }
      if($(this).find('input').val() == "Lt"){
        defect2 = true;
      }
      if($(this).find('input').val() == "Mrd"){
        defect3 = true;
      }
    });
    
    dataSet2(factorSelected, defect, defect2, defect3);
    //console.log($(this).find('input').val());
    
  }
  else{
    dataSet(factorSelected);
  }

});

function dataSet2(event, defect, defect2, defect3){
  if(event=="1"){
    if(defect === true){
      myChart.data.datasets[0].data=[3,
                                    6,
                                    10,
                                    12,
                                    19,
                                    25]
    }
    else if(defect === false){
      myChart.data.datasets[0].data = $('dataset').empty();
    }
    if(defect2 === true){
      myChart.data.datasets[1].data = $('dataset').empty();
    }else if(defect2 === false){
      myChart.data.datasets[1].data = $('dataset').empty();
    }
    if(defect3 === true){
      myChart.data.datasets[2].data = [16,
                                      18,
                                      28,
                                      45,
                                      60,
                                      80]
    }else if(defect3 === false){
      myChart.data.datasets[2].data = $('dataset').empty();
    }
    myChart.update();
  }else if(event=="2"){
    if(defect === true){
      myChart.data.datasets[0].data = $('dataset').empty();
    } else if(defect === false){
      myChart.data.datasets[0].data = $('dataset').empty();
    }
    if(defect2 === true){
      myChart.data.datasets[1].data = [ 14,
                              28,
                              80,
                              20,
                              60,
                              45];
    } else if(defect2 === false){
      myChart.data.datasets[1].data = $('dataset').empty();
    }
    if(defect3 === true){
      myChart.data.datasets[2].data = [   16,
                              18,
                              28,
                              45,
                              60,
                              80

      ]
    } else if(defect3 === false){
      myChart.data.datasets[2].data = $('dataset').empty();
    }
    myChart.update();
  }else if(event=="3"){
    if(defect === true){
    myChart.data.datasets[0].data=[3,
                            6,
                            10,
                            12,
                            19,
                            25];
    }else if(defect === false){
      myChart.data.datasets[0].data = $('dataset').empty();
    }
    if(defect2 === true){
      myChart.data.datasets[1].data=[14,
                              28,
                              80,
                              20,
                              60,
                              45];
    }else if(defect2 === false){
      myChart.data.datasets[1].data = $('dataset').empty();
    }
    if(defect3 === true){
      myChart.data.datasets[2].data = $('dataset').empty();
    }
    else if(defect3 === false){
      myChart.data.datasets[2].data = $('dataset').empty();
    }
    myChart.update();
  }
}

function dataSet(event){
  if(event=="1"){
   myChart.data.datasets[0].data=[   3,
                              6,
                              10,
                              12,
                              19,
                              25]
   myChart.data.datasets[1].data = $('dataset').empty();
   myChart.data.datasets[2].data = [16,
                              18,
                              28,
                              45,
                              60,
                              80],
    myChart.update();
  }else if(event=="2"){
    myChart.data.datasets[0].data = $('dataset').empty();
    myChart.data.datasets[1].data = [ 14,
                            28,
                            80,
                            20,
                            60,
                            45];
    myChart.data.datasets[2].data = [   16,
                            18,
                            28,
                            45,
                            60,
                            80

    ]

    myChart.update();
  }else if(event=="3"){
    myChart.data.datasets[0].data=[3,
                            6,
                            10,
                            12,
                            19,
                            25];
    myChart.data.datasets[1].data=[14,
                            28,
                            80,
                            20,
                            60,
                            45];
        myChart.data.datasets[2].data = $('dataset').empty();

    myChart.update();
  }
}
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>
        Defect Charts
    </title>
    <meta name="viewport" content="width=device-width, inital-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js" ></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.bundle.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.bundle.min.js"></script>

    <!-- jQuery library -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

    <!-- JS & CSS library of MultiSelect plugin -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-multiselect/0.9.13/js/bootstrap-multiselect.js"></script>
    <script src="multiselect/jquery.multiselect.js"></script>
    <link rel="stylesheet" href="multiselect/jquery.multiselect.css">
  </head>
  <body>
    <div class="container-fluid">
      <div class="row">
        <div class="col-4">
          <div class="form-group mt-3 mb-3">
            <label for="dataset">Select Factor</label>
            <select class="form-control" id="dataset">
              <option id="opt1" value="1">Low</option>
              <option id="opt2" value="2">Medium</option>
              <option id="opt3" value="3">High</option>
            </select>
          </div>
        </div>
      </div>
    </div>
    <div class="col-4"></div>
      <div class="row">
        <div class="col"></div>
        <div class="col-8">
          <div id="chart-wrapper">
            <canvas id="myChart"></canvas>
          </div>
          <div class="container">
            <h4>Multi-Select Defect</h4>
            <div class="row">
              <div class="col-4"></div>
              <select name="langOpt[]" multiple id="langOpt">
                <option value ="Du">Dust</option>
                <option value ="Lt">Lint</option>
                <option value ="Mrd">Manual Rundown</option>
              </select>
            </div>
          </div>
        </div>
      </div>
  </body>
</html>


推荐阅读