2

我知道有很多关于这个的问题,但我没有找到我需要的东西

这是我的js

$j('.showCategory li a').each(function() {
    var catId = $j(this).attr("data-id");
    this.href += (/\?/.test(this.href) ? '&' : '?') + 'filter_category='+ catId;
});

这很好用,因为它使用我想要的参数生成我的 url。问题是,如果我点击多次(这个过滤器在所有页面上都可用),它会一遍又一遍地添加相同的参数,生成这样的 url:

http://www.blabla.com/search?search=cat&filter_duration=short&filter_duration=medium&filter_duration=long

我尝试通过添加一个条件来解决这个问题

$j('.showCategory li a').each(function() {
    if(this.href.indexOf('filter_category') == -1) {
        var catId = $j(this).attr("data-id");
        this.href += (/\?/.test(this.href) ? '&' : '?') + 'filter_category='+ catId;
    } else {
        ????
    }
});

但在这种情况下,它不会添加任何参数,但不会替换值。请问我该如何解决?

4

1 回答 1

2

使用此模式使用正则表达式进行就地替换:

} else {
this.href = this.href.replace(/filter_duration=(.+?)(&|$.*)()/, "filter_duration=" + catId + "$2"
}

这使用捕获组来查找现有的 filter_duration 元素查询参数,并将现有值替换为新值(在本例中为 catId)。无论它是否是字符串中的最后一个查询参数,这都应该有效。

也就是说,我不会将此解决方案视为最佳解决方案,并且您可能最好将您想要的值存储在客户端 javascript 对象中的 url 中,然后每当有人更改时每次从头开始重建 url类别。这样,您就不必担心替换出现问题以及客户端进入不良状态的难以测试的案例。

于 2013-02-25T17:41:07.177 回答