0

我正在尝试开发一个搜索过滤器并利用 HTML5 历史 API 来减少发送到服务器的请求数量。如果用户选中一个复选框以应用某个过滤器,我会将该数据保存在历史状态中,这样当用户取消选中它时,我就可以从历史中加载数据,而不是从服务器再次获取它。

当用户选中或取消选中过滤器时,我正在更改窗口 URL 以匹配设置的过滤器,例如,如果用户尝试仅过滤某个类别的汽车品牌,我会更改 URL,例如“cars?filter-brand[] =1'。

但是当应用多个过滤器时,我无法确定是从服务器加载数据还是从历史记录加载数据。

目前我正在使用以下代码。

pushString variable is the new query string that will be created.
var back = [],forward = [];
if(back[back.length-1] === decodeURI(pushString)){   //check last back val against the next URL to be created
                back.pop();
                forward.push(currentLocation);
                history.back();
                return true;
            }else if(forward[forward.length-1] === decodeURI(pushString)){
                forward.pop();
                back.push(currentLocation);
                history.forward();
                return true;
            }else{
                back.push(currentLocation); //add current win location
            }
4

1 回答 1

0

您可以检查您的过滤器是否等效。

比较对象

这是一个简单的函数,它需要两个文件,并让您知道它们是否等效(注意:为简单起见,原型不安全)。

function objEqual(a, b) {
  function toStr(o){
    var keys = [], values = [];
    for (k in o) {
      keys.push(k);
      values.push(o[k]);
    }
    keys.sort();
    values.sort();
    return JSON.stringify(keys) 
    + JSON.stringify(values);
  }
  return toStr(a) === toStr(b);
}

演示

使用网址

将 URL ( ) 的查询部分传递window.location.search给此函数。它会给你一个对象,你可以使用上述函数与另一个对象进行比较。

function parseURL(url){
  var obj = {}, parts = url.split("&");
  for (var i=0, part; part = parts[i]; i++) {
    var x = part.split("="), k = x[0], v = x[1];
    obj[k] = v;
  }
  return obj;  
}

演示

历史 API 对象

您可以使用 History API 存储对象。

window.history.pushState(someObject, "", "someURL")

history.state您可以使用或在处理程序中获取此对象popState

跟踪事物

toStr如果从第一部分中抽出函数,就可以序列化当前的过滤器。然后,您可以将所有状态以及关联的所有数据存储在一个对象中。

当你推送一个状态时,你可以更新你的全局cache对象。此代码应位于 AJAX 响应的处理程序中。

var key = toStr(parseUrl(location.search));
cache[key] = dataFromTheServer;

然后抽象您的 AJAX 函数以首先检查缓存。

function getFilterResults(filters, callback) {
    var cached = cache[toStr(filters)]
    if (cached != null) callback(cached);
    else doSomeAJAXStuff().then(callback);
}

您还可以使用 localstorage 进行更持久的缓存,但这需要更高级的代码和过期数据。

于 2013-08-10T06:32:22.443 回答