【问题标题】:Laravel - Creating an AJAX filter for filtering a SQL databaseLaravel - 创建用于过滤 SQL 数据库的 AJAX 过滤器
【发布时间】:2017-08-05 15:23:44
【问题描述】:

这是我一次又一次尝试做的事情。我的数据库中有以下列(名为type),名为pets

type 
DOG 
DOG 
CAT 
CAT 
DOG

我要做的是创建一个过滤器,这样我就可以选择是只显示狗、只显示猫还是两者都显示。这应该是实时完成的(使用 AJAX)——所以当我选择我想要的过滤器时,我不必重新加载网页。

我为 AJAX 请求提出了这个:

$(document).ready(function() {
    $('li.active').on('click', function() {
        $value=$(this).val();
        $.ajax({
            type : 'get',
            url  : '{{$petname->pet_code}}',
            data : {'search':$value},
            success:function(data) {
                $('#results-of-ajax-search').html(data);
            }
        });
    });
});

不幸的是,这并没有按预期工作。我猜我无法定位所选过滤器的必要值。我将它用于这个问题的前端部分:

$.fn.ulSelect = function() {
  var ul = $(this);

  if (!ul.hasClass('zg-ul-select-type')) {
    ul.addClass('zg-ul-select-type');
  }
  // SVG arrow
  var arrowtype = '<svg id="ul-arrowtype" xmlns="http://www.w3.org/2000/svg" version="1.1" width="10" height="10" viewBox="0 0 32 32"><line stroke-width="1" x1="" y1="" x2="" y2="" stroke="#449FDB" opacity=""/><path d="M4.131 8.962c-0.434-0.429-1.134-0.429-1.566 0-0.432 0.427-0.432 1.122 0 1.55l12.653 12.528c0.434 0.429 1.133 0.429 1.566 0l12.653-12.528c0.432-0.429 0.434-1.122 0-1.55s-1.136-0.429-1.566-0.002l-11.87 11.426-11.869-11.424z" fill="#111"/></svg>';
  $('li:first-of-type', this).addClass('active').append(arrowtype);
  $(this).on('click', 'li', function(event) {

    // Remove div#selected if it exists
    if ($('#selected--zg-ul-select-type').length) {
      $('#selected--zg-ul-select-type').remove();
    }
    ul.before('<div id="selected--zg-ul-select-type">');
    var selected = $('#selected--zg-ul-select-type');
    $('li #ul-arrowtype', ul).remove();
    ul.toggleClass('active');
    ul.children().removeClass('active');
    $(this).toggleClass('active');

    var selectedText = $(this).text();
    if (ul.hasClass('active')) {
      selected.text(selectedText).addClass('active').append(arrowtype);
    } else {
      selected.text('').removeClass('active');
      $('li.active', ul).append(arrowtype);
    }
  });
  $(document).on('click', function(event) {
    if ($('ul.zg-ul-select-type').length) {
      if (!$('ul.zg-ul-select-type').has(event.target).length == 0) {
        return;
      } else {
        $('ul.zg-ul-select-type').removeClass('active');
        $('#selected--zg-ul-select-type').removeClass('active').text('');
        $('#ul-arrowtype').remove();
        $('ul.zg-ul-select-type li.active').append(arrowtype);
      }
    }
  });
};
$('#be-select-type').ulSelect();
ul.zg-ul-select-type {
  position: relative;
  outline: none;
  text-align: center;
  margin: 0 auto;
  width: 250px;
  border-radius: 3px;
  box-sizing: border-box;
  cursor: pointer;
  padding: 0;
  overflow: auto;
}

ul.zg-ul-select-type li {
  outline: none;
  text-align: left;
  background-color: #fff;
  display: none;
  padding: 15px;
}

ul.zg-ul-select-type li.active {
  align-items: center;
  border: 1px solid #ccc;
  border-radius: 3px;
  color: #111;
  display: flex;
  justify-content: space-between;
}

ul.zg-ul-select-type.active li {
  border: none;
  outline: none;
  box-shadow: none;
  display: block;
}

ul.zg-ul-select-type.active li:hover {
  background: #f1f1f1;
}

ul.zg-ul-select-type.active li.active:hover {
  background: #f1f1f1;
}

#selected--zg-ul-select-type {
  outline: none;
  background-color: #fff;
  margin: 0 auto;
  text-align: center;
  width: 250px;
  align-items: center;
  box-sizing: border-box;
  color: #111;
  display: flex;
  justify-content: space-between;
}

#selected--zg-ul-select-type.active {
  border: 1px solid #ccc;
  border-radius: 3px;
  padding: 15px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span class="data-control">
  <ul id="be-select-type" tabindex="0">
	<li><span class="filter-text" id="filter-type-reset">Filter by Type</span></li>
    <li><span class="filter-text" id="filter-type-cat">Dog</span></li>
    <li><span class="filter-text" id="filter-type-dog">Cat</span></li>
</ul>
</span>

如果您运行该代码,它会创建前端选择列表并将active 类添加到列表中的选定值。

对于 Laravel 后端控制器,我猜您必须将 where 语句添加到 DB 查询并使用 = 来获取和过滤 $request 的值。

基本上,这个问题的正确答案是向我的控制器创建一个 AJAX 请求。

【问题讨论】:

    标签: javascript php jquery ajax laravel


    【解决方案1】:

    在您的第一个代码块中,当您尝试获取 li 元素的“值”时,您必须使用 .text() - 如果您只想获取文本或 .html() - 如果您想获取内部 HTML:

    $(document).ready(function() {
        $('li.active').on('click', function() {
            var $value=$(this).text();
            $.ajax({
                type : 'get',
                url  : '{{$petname->pet_code}}',
                data : {'search':$value},
                success:function(data) {
                    $('#results-of-ajax-search').html(data);
                }
            });
        });
    });
    

    已编辑:

    作为您的问题的快速修复,您可以删除上面的代码块并使用您的前端部分代码进行更改。 A 添加了一个 sn-p :

    $(function(){
    
    $.fn.ulSelect = function() {
      var ul = $(this);
    
      if (!ul.hasClass('zg-ul-select-type')) {
        ul.addClass('zg-ul-select-type');
      }
      // SVG arrow
      var arrowtype = '<svg id="ul-arrowtype" xmlns="http://www.w3.org/2000/svg" version="1.1" width="10" height="10" viewBox="0 0 32 32"><line stroke-width="1" x1="" y1="" x2="" y2="" stroke="#449FDB" opacity=""/><path d="M4.131 8.962c-0.434-0.429-1.134-0.429-1.566 0-0.432 0.427-0.432 1.122 0 1.55l12.653 12.528c0.434 0.429 1.133 0.429 1.566 0l12.653-12.528c0.432-0.429 0.434-1.122 0-1.55s-1.136-0.429-1.566-0.002l-11.87 11.426-11.869-11.424z" fill="#111"/></svg>';
      $('li:first-of-type', this).addClass('active').append(arrowtype);
    
    
      $(this).on('click', 'li', function(event) {
    
        // Remove div#selected if it exists
        if ($('#selected--zg-ul-select-type').length) {
          $('#selected--zg-ul-select-type').remove();
        }
        ul.before('<div id="selected--zg-ul-select-type">');
        var selected = $('#selected--zg-ul-select-type');
        $('li #ul-arrowtype', ul).remove();
        ul.toggleClass('active');
        ul.children().removeClass('active');
        $(this).toggleClass('active');
    
        var selectedText = $(this).text();
        if (ul.hasClass('active')) {
          selected.text(selectedText).addClass('active').append(arrowtype);
        } else {
          selected.text('').removeClass('active');
          $('li.active', ul).append(arrowtype);
          /* AJAX GET REQUEST */
          if(!$(this).is('li:first-of-type')){
            $.ajax({
                type : 'get',
                url  : '{{$petname->pet_code}}',
                data : {'search':selectedText},
                success:function(data) {
                    $('#results-of-ajax-search').html(data);
                }
            });
          }
          /* AJAX GET REQUEST ENDS */
        }
    
      });
    
      $(document).on('click', function(event) {
        if ($('ul.zg-ul-select-type').length) {
          if (!$('ul.zg-ul-select-type').has(event.target).length == 0) {
            return;
          } else {
            $('ul.zg-ul-select-type').removeClass('active');
            $('#selected--zg-ul-select-type').removeClass('active').text('');
            $('#ul-arrowtype').remove();
            $('ul.zg-ul-select-type li.active').append(arrowtype);
          }
        }
      });
    
    };
    $('#be-select-type').ulSelect();
    
    });
    ul.zg-ul-select-type {
      position: relative;
      outline: none;
      text-align: center;
      margin: 0 auto;
      width: 250px;
      border-radius: 3px;
      box-sizing: border-box;
      cursor: pointer;
      padding: 0;
      overflow: auto;
    }
    
    ul.zg-ul-select-type li {
      outline: none;
      text-align: left;
      background-color: #fff;
      display: none;
      padding: 15px;
    }
    
    ul.zg-ul-select-type li.active {
      align-items: center;
      border: 1px solid #ccc;
      border-radius: 3px;
      color: #111;
      display: flex;
      justify-content: space-between;
    }
    
    ul.zg-ul-select-type.active li {
      border: none;
      outline: none;
      box-shadow: none;
      display: block;
    }
    
    ul.zg-ul-select-type.active li:hover {
      background: #f1f1f1;
    }
    
    ul.zg-ul-select-type.active li.active:hover {
      background: #f1f1f1;
    }
    
    #selected--zg-ul-select-type {
      outline: none;
      background-color: #fff;
      margin: 0 auto;
      text-align: center;
      width: 250px;
      align-items: center;
      box-sizing: border-box;
      color: #111;
      display: flex;
      justify-content: space-between;
    }
    
    #selected--zg-ul-select-type.active {
      border: 1px solid #ccc;
      border-radius: 3px;
      padding: 15px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <span class="data-control">
      <ul id="be-select-type" tabindex="0">
    	<li><span class="filter-text" id="filter-type-reset">Filter by Type</span></li>
        <li><span class="filter-text" id="filter-type-cat">Dog</span></li>
        <li><span class="filter-text" id="filter-type-dog">Cat</span></li>
    </ul>
    </span>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      相关资源
      最近更新 更多