【问题标题】:remember checkbox and radio button state after page reload记住页面重新加载后的复选框和单选按钮状态
【发布时间】:2021-11-02 17:37:26
【问题描述】:

我正在使用 jQuery 和 Laravel (PHP) 制作过滤器。当我单击复选框或单选按钮时,它会过滤数据,但是,如果我单击复选框或单选按钮并刷新页面,选中复选框或单选按钮的状态将不再保留。我希望即使在页面重新加载后仍保持选中状态。

这是我的代码。

<div class="search">

    <input type="radio" name="expertise[]" value="backend" />programmer
    <input type="radio" name="expertise[]" value="frontend" />programmer

</div>
<div class="avail">
    <p>
        <input type="checkbox" name="available[]" value="20" />20
    </p>
    <p>
        <input type="checkbox"  name="available[]" value="30" />30
    </p>
</div>

jQuery

<script>
    var expertise = [];
    var  available = [];

    $(document).on('change', 'input[name="expertise[]"], input[name="available[]"]', function(e) {
        e.preventDefault();

        types = []; 
        available = [];
     

        if (document.location.href.indexOf('filter') > -1) {
            var url = '../developers/filter?type=dev';
        } else {
            var url = '/developers/filter?type=dev';
        }

        $('input[name="type[]"]:checked').each(function() {
            expertise.push($(this).val());
            url = url + '&expertise=' + $(this).val();
        });
        $('input[name="available[]"]:checked').each(function() {
            available.push($(this).val());
            url = url + '&available=' + $(this).val();
        });
     

        if (document.location.href.indexOf('filter') > -1) {
            $.get('../developers/filter', {
                type: 'dev',
                expertise: expertise,
                available: available,
               
            }, function(markup) {
                $('.dev-holder').html(markup);
            });
        } else {
            $.get('developers/filter', {
                type: 'dev',
                expertise: expertise,
                available: available,
               
            }, function(markup) {
                $('.dev-holder').html(markup);
            });
        }
        window.history.pushState("", "", url);
    });

</script>

Laravel 控制器

public function search(Request $request)
{

    $type = $request->get('expertise'); 
    $availability = $request->get('available');
  
  
  $url = 'filter';

    $users = User::where('type','dev')->where('is_approved', '=', 1);
    if (!empty($type)) {
            $users = $users->where('expertise','dev');
    }
        $users->when($availability, function ($query, $availability ) {
            return $query->where(function ($whereQuery) use ($availability ) {
                foreach ($availability as $item) {
                    $whereQuery->orWhere('avaibility', 'LIKE', $item); 
                }
            });
        });
     

【问题讨论】:

    标签: javascript php jquery ajax laravel


    【解决方案1】:

    JS/jQuery:保存到本地存储
    PHP/Laravel:保存在会话中,

    session_start();
    if (!isset($_SESSION['vals']) {
        $_SESSION['vals'] = 'default=stuff'
    }
    
    $_SESSION['vals'] //access it like this
    

    然后您可以在他们提交时更改它 ,

    //set
    let values = ["yes"]
    localStorage.setItem('vals',JSON.stringify(values))
    
    //retrieve
    let result = localStorage.getItem('vals')
    result = JSON.parse(result)
    
    //use
    if (result[0] = "yes") {
        yourradiothing.checked = true
    }
    
    

    您还可以存储其他东西。

    【讨论】:

      【解决方案2】:

      U 可以使用本地存储来保存状态。假设如果单击复选框,则将其存储在本地存储中,如果页面重新加载,则可以从本地存储中提取数据并应用它。

      【讨论】:

      • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
      【解决方案3】:

      您已经将内容推送到 URL,因此当您加载页面时,您可以检查 url 查询字符串是否已设置。

      $(function () {
          var urlSearchParams = new URLSearchParams(window.location.search); 
          if (urlSearchParams.get('expertise[]')) {
              $('input[name="expertise[]"][value="'+urlSearchParams.get('expertise[]')+'"]').prop('checked', true);
          }
          urlSearchParams.getAll('available[]').forEach(function (val) {
             $('input[name="available[]"][value="'+val+'"]').prop('checked', true);
          });
      });
      
      

      注意URLSearchParams需要在IE中填充

      这也可以通过 HTML 和 Laravel 来实现:

      <div class="expertise">
      
          <input type="radio" name="expertise[]" id="backend" value="backend" 
      {{in_array('backend', request()->input('expertise',[])) ? 'checked' : ''}} />Backend
          <input type="radio" name="expertise[]" id="frontend" value="frontend" 
       {{in_array('frontend', request()->input('expertise',[])) ? 'checked' : ''}}/>Frontend
      
      </div>
      <div class="availability">
          <p>
              <input type="checkbox" name="available[]" value="above30"
              {{in_array('above30', request()->input('available',[])) ? 'checked' : ''}}
              />Above 30 hrs/week
          </p>
          <p>
              <input type="checkbox"  name="available[]" value="below30"
              {{in_array('below30', request()->input('available',[])) ? 'checked' : ''}}
              />Below 30 hrs/week
          </p>
      </div>
      

      假设您在 .blade.php 文件中有此 HTML

      【讨论】:

      • 感谢@apokryfos,使用此 {{in_array('backend', request()->input('expertise',[])) ? 'checked' : ''}} 我得到错误 in_array() 期望参数 2 是数组,给定字符串
      • 当我第一次点击后端选项时,我会在 url 中有一些参数,如类型、专业知识和标签。当我单击支持的第一个选项并重新加载页面时,我得到 type=device&expertise=backend&tags= these in url on alert(urlSearchParams)
      • 我很困惑,因为 expertise 在 HTML 中被命名为 expertise[] 暗示一个数组,但它只作为单个值发送。将in_array 更改为request()-&gt;input('expertise') === 'backend') ? 'checked' : '' 可能会解决这个问题
      • 感谢@apokryfos。我已经接受了你的回答。只有一个问题,我在 url 中附加了 %5B%5D,如果我没有在 url 中附加这个问题,我会得到错误无效的 foreach 循环。有没有办法让干净的 url 从 url 中删除 %5B%5D
      • %5B%5D 是 [] 并且是让 PHP 和 Laravel 将输入视为数组的方法。如果您删除它,您将无法遍历值,这是您必须执行的操作才能处理任意数量的 available 选项。
      猜你喜欢
      • 1970-01-01
      • 2021-03-01
      • 2012-02-19
      • 2012-06-24
      • 1970-01-01
      • 2014-01-07
      • 2016-08-23
      • 2015-10-18
      • 1970-01-01
      相关资源
      最近更新 更多