Jquery - показать отношения между 2 подборками - PullRequest
0 голосов
/ 08 мая 2018

Я создал модуль сайта с PHP, MySQL, Bootstrap и Jquery.У меня есть 4 флажка с данными.Я храню данные в базе данных.Если клиент выбирает 2 флажка, появляется модальный вариант начальной загрузки с отношениями между двумя вариантами выбора.Это на самом деле работает, но модал показывает данные несколько раз.

В этом случае компьютер1 подключен к компьютеру3, который подключен к компьютеру4.Поэтому, если я выбираю computer1 и computer4, он показывает правильные отношения, но несколько раз:

Bootstrap Modal

$(document).ready(function() {
  $('#checkBtn').click(function getElementRelation(element1, element2) {
    var ele = document.getElementsByName("case");
    var modal = document.getElementById("modaldata");
    var hu = document.getElementsByName("hu");
    var hu2 = document.getElementsByName("hu2");

    if (modal.innerHTML === "") // if no relation is detected yet put start element
    {
      modal.innerHTML += element1;
    }

    //loop in data (this shows datas several times)
    for (var i = 0; i < ele.length; i++) {
      if (hu[i].innerHTML === element1) //if data = element 1 then put related element
      {
        modal.innerHTML += hu[i].innerHTML + "--->" + hu2[i].innerHTML + " ";
        if (hu2[i].innerHTML !== element2) //if related element != end element call function to get relation between related element and end element
        {
          getElementRelation(hu2[i].innerHTML, element2);
        }
      }
    }

    var start = ""; //hold start element
    var end = ""; //hold end element
    for (var i = 0; i < ele.length; i++) {
      if (ele[i].checked === true) {
        if (start === "") {
          start = hu[i].innerHTML; //set start element
        } else {
          end = hu[i].innerHTML; //set end element
        }
      }
    }

    checked = $("input[type=checkbox]:checked").length === 2;
    if (!checked) {
      alert("You must check 2 checkbox!");
      return false;
    } else {
      getElementRelation(start, end);
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" />


<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<!-- Checkboxes -->



<div class="container">
        <div class="row">
            <div class="col-sm-6">
                <table class="table table-striped table-bordered">
                    <thead>
                        <tr>
                            <th></th>
                            <th>Name</th>
                            <th>Connect</th>
                        </tr>
                    </thead>
                    <tbody>
                        
                        <tr>
                            <!-- Checkboxes -->
                            <td><input type="checkbox" name="case"></td>
                            <td><p name="hu" value="Computer1">Computer1</p></td>
                            <td><p name="hu2" value="Computer3">Computer3</p></td>
                        </tr>
                        <tr>
                            <td><input type="checkbox" name="case"></td>
                            <td><p name="hu" value="Computer2">Computer2</p></td>
                            <td></td>
                        </tr>
                        <tr>
                            <td><input type="checkbox" name="case"></td>
                            <td><p name="hu" value="Computer3">Computer3</p></td>
                            <td><p name="hu2" value="Computer4">Computer4</p></td>
                        </tr>
                        <tr>
                            <td><input type="checkbox" name="case"></td>
                            <td><p name="hu" value="Computer4">Computer4</p></td>
                            <td></td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>

<!-- Input button -->
<div class="container">
  <div class="row">
    <div class="col-sm-12">
      <input type="button" id="checkBtn" value="View" data-toggle="modal" data-target="#myModal" class="btn btn-info">
    </div>
  </div>
</div>

<!-- Modal -->
<div id="myModal" class="modal fade" role="dialog">
  <div class="modal-dialog modal-sm">
    <div class="modal-content">
      <div class="modal-header">
        <h4 class="modal-title">Title</h4>
        <button type="button" class="close" data-dismiss="modal">&times;</button>
      </div>
      <div class="modal-body" id="modaldata">
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-success" data-dismiss="modal">Close</button>
      </div>
    </div>
  </div>
</div>

Выберите Компьютер1 и Компьютер3 и несколько раз показывает данные

1 Ответ

0 голосов
/ 08 мая 2018

Во-первых, у тега абзаца нет атрибутов name или value. Если вы хотите создать новые атрибуты, используйте HTML5 data-attribute .

Чтобы упростить последующий код JS, мы добавим эти атрибуты к элементу input. Например,

<tr>
    <td><input type="checkbox" name="case" data-name="Computer1" data-connect="Computer3"></td>
    <td>Computer1</td>
    <td>Computer3</td>
</tr>

Во-вторых, ваш код JS был немного запутанным. Я думаю, почему вы получаете повторяющиеся результаты, потому что вы рекурсивно звоните getElementRelation().

Я бы упростил ваш код, как показано ниже

$(function() {
    // cache jQuery objects that we will be re-using
    var checkBoxes = $("input[name=case]");
    var myModal = $("#myModal");

    // get all relationships i.e. key = name, value = connect or null
    var relations = {};
    checkBoxes.each(function () {
        relations[this.dataset.name] = this.dataset.connect;
    });

    // when the getElementRelation() function is called normally, it is expected 
    // to have 2 arguments (element1 and element2); 
    // but as an event handler it will have 1 argument (Event object) 
    $('#checkBtn').click(function getElementRelation(e) {

        // get checked checkboxes
        var checkedBoxes = checkBoxes.filter(":checked");

        // validate first
        if (checkedBoxes.length != 2) {
            alert("You must check 2 checkbox!");
            return false;
        }

        // build modal body
        var html = '';

        var current = checkedBoxes[0].dataset.name,
            end = checkedBoxes[1].dataset.name;

        while (current) {
            html += current;

            // check if it is connected
            var next = relations[current];

            // if it is not connected, stop
            if (!next) {
                html = 'Not related';
                break;
            }

            // otherwise append HTML
            html += ' -> ' + next + '<br>';

            // if it is the end, stop
            if (next == end) break;

            // you may want to delete the key to avoid any infinite loop in case
            // delete relations[current];

            // start over using connected one
            current = next;
        }

        // update modal
        myModal.find('.modal-body').html(html);

        // open the modal dynamically once it is ready
        myModal.modal('show');
    });
});

И последнее, вернемся в ваш HTML, удалите data-toggle="modal" и data-target="#myModal", поскольку мы открываем модальное динамически .

Демо

$(function() {
  // cache jQuery objects that we will be re-using
  var checkBoxes = $("input[name=case]");
  var myModal = $("#myModal");

  // get all relationships i.e. key = name, value = connect or null
  var relations = {};
  checkBoxes.each(function() {
    relations[this.dataset.name] = this.dataset.connect;
  });

  $('#checkBtn').click(function() {
    // get checked checkboxes
    var checkedBoxes = checkBoxes.filter(":checked");

    // validate first
    if (checkedBoxes.length != 2) {
      alert("You must check 2 checkbox!");
      return false;
    }

    // build modal body
    var html = '';
    
    var current = checkedBoxes[0].dataset.name, // start with
      end = checkedBoxes[1].dataset.name; // end with
      
    while (current) {
      html += current;

      // check if it is connected
      var next = relations[current];

      // if it is not connected, stop
      if (!next) {
        html = 'Not related';
        break;
      }

      // otherwise append HTML
      html += ' -> ' + next + '<br>';

      // if it is the end, stop
      if (next == end) break;

      // start over using connected one
      current = next;
    }

    // update modal
    myModal.find('.modal-body').html(html);

    // open the modal dynamically once it is ready
    myModal.modal('show');
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" />
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<!-- Checkboxes -->
<div class="container">
  <div class="row">
    <div class="col-sm-6">
      <table class="table table-striped table-bordered">
        <thead>
          <tr>
            <th></th>
            <th>Name</th>
            <th>Connect</th>
          </tr>
        </thead>
        <tbody>

          <tr>
            <td><input type="checkbox" name="case" data-name="Computer1" data-connect="Computer3"></td>
            <td>Computer1</td>
            <td>Computer3</td>
          </tr>
          <tr>
            <td><input type="checkbox" name="case" data-name="Computer2"></td>
            <td>Computer2</td>
            <td></td>
          </tr>
          <tr>
            <td><input type="checkbox" name="case" data-name="Computer3" data-connect="Computer4"></td>
            <td>Computer3</td>
            <td>Computer4</td>
          </tr>
          <tr>
            <td><input type="checkbox" name="case" data-name="Computer4"></td>
            <td>Computer4</td>
            <td></td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>
</div>

<!-- Input button -->
<div class="container">
  <div class="row">
    <div class="col-sm-12">
      <input type="button" id="checkBtn" value="View" class="btn btn-info">
    </div>
  </div>
</div>

<!-- Modal -->
<div id="myModal" class="modal fade" role="dialog">
  <div class="modal-dialog modal-sm">
    <div class="modal-content">
      <div class="modal-header">
        <h4 class="modal-title">Title</h4>
        <button type="button" class="close" data-dismiss="modal">&times;</button>
      </div>
      <div class="modal-body" id="modaldata">
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-success" data-dismiss="modal">Close</button>
      </div>
    </div>
  </div>
</div>
...