【问题标题】:Enabling History API with datatables使用数据表启用 History API
【发布时间】:2012-11-01 12:44:33
【问题描述】:

我在页面上有一个 dataTable 对象,表示我需要使用 url /releases 跟踪的版本列表我想添加以下功能

  1. 如果/releases?query=<query>dataTable 将使用提供的查询进行初始化
  2. query 参数会在用户更改搜索词时更新
  3. 浏览器中的后退和前进按钮用于相应的查询

到目前为止,我能够做到前 2 个,但是当我监听 popstate 事件时,重绘表格会触发 pushState,我不知道如何防止。到目前为止,这是我的代码:

$(document).ready(function(){
  var prevSearch;
  var table = $('#releases').dataTable({
    "bJQueryUI" : true,
    "sPaginationType" : "full_numbers",
    "iDisplayLength" : 50,
    "oSearch": {"sSearch": '#{params[:query]}'},
    "fnDrawCallback": function(oSettings) {
        var curSearch = oSettings.oPreviousSearch.sSearch;
        if (!prevSearch) {
          prevSearch = curSearch;
        } else if (curSearch != prevSearch) {
          console.log("changed to: " + curSearch);
          history.pushState({query: curSearch}, "title", "releases?query=" + curSearch);
          prevSearch = curSearch;
        }
     }
  });
  window.addEventListener("popstate", function(e) {
    if (e.state) {
      table.fnFilter(e.state.query);          
    }
  });
});

注意,我使用的是 rails 后端,这是页面中提供的内联 javascript。

【问题讨论】:

    标签: javascript jquery datatables html5-history


    【解决方案1】:

    这里只有两个选项:

    • 将 pushState 代码移出 drawCallback。当用户输入某些内容时,必须有一些其他代码导致数据表绘制。把你的 pushState 代码放在那里。这是理想的解决方案
    • 添加这样的 hack

      $(document).ready(function () {
          var prevSearch;
          var saveState = true;
          var table = $('#releases').dataTable({
              "bJQueryUI":true,
              "sPaginationType":"full_numbers",
              "iDisplayLength":50,
              "oSearch":{"sSearch":'#{params[:query]}'},
              "fnDrawCallback":function (oSettings) {
                  var curSearch = oSettings.oPreviousSearch.sSearch;
                  if (!prevSearch) {
                      prevSearch = curSearch;
                  } else if (curSearch != prevSearch) {
                      console.log("changed to: " + curSearch);
                      if (saveState) {
                          history.pushState({query:curSearch}, "title", "releases?query=" + curSearch);
                      }
                      prevSearch = curSearch;
                  }
              }
          });
          window.addEventListener("popstate", function (e) {
              if (e.state) {
                  saveState = false;
                  table.fnFilter(e.state.query);
                  saveState = true;
              }
          });
      });
      

    【讨论】:

    • 我一直在寻找另一个更合适的回调来放入 pushState 代码,但我似乎找不到。我最终实施了一个类似于您的第二个解决方案的解决方案,但我非常感谢帮助找到合适的回调解决方案。
    • 用户在哪里输入搜索词?我假设它是一个输入。表格是否会随着时间或按下回车键而更新?无论哪种方式,您都可以将事件侦听器绑定到该输入框并将您的 pushstate 函数移动到那里
    • 这是一个很好的建议,但我希望数据表 API 有一些东西。我不想触及数据表插件控制的元素。
    • 这就是问题所在,您可能正在使用他们的默认搜索框进行搜索..所以这是这种情况下的唯一方法。如果您愿意,您可以自己实现相同的搜索框。你只需要调用 fnFilter(term) 函数,但功能上是一样的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多