使用window.location.assign从复选框向URL添加多个GET参数

时间:2015-05-28 04:17:27

标签: javascript jquery ajax wordpress window.location

我尝试使用JavaScript将参数添加到当前网址以过滤WordPress帖子。示例:http://domain.com/houses/?rooms=1,2&bath=1&yard=yes

我已成功完成了其中一个参数,但我没有理解如何添加多个参数。得到这个的正确方法是什么?

另外,正在使用window.location.assign(),将参数添加到URL的正确方法是什么?使用AJAX更好/更安全吗?

以下是我的代码

HTML

<div id="filter-rooms">
       <ul>
           <li>
               <input type="checkbox" value="1" id="rooms" />1 Room</li>
           <li>
               <input type="checkbox" value="2" id="rooms" />2 Rooms</li>
           <li>
               <input type="checkbox" value="3" id="rooms" />3 Rooms</li>
           <li>
               <input type="checkbox" value="4" id="rooms" />4 Rooms</li>
      </ul>
</div>

<div id="filter-bath">
    <ul>
        <li>
            <input type="checkbox" value="1" id="bath" />1 Bathrooms</li>
        <li>
            <input type="checkbox" value="2" id="bath" />2 Bathrooms</li>
        <li>
            <input type="checkbox" value="3" id="bath" />3 Bathrooms</li>
    </ul>
</div>

<div id="filter-yard">
    <ul>
        <li>
            <input type="radio" name="yard" value="yes" id="yard" />Yes</li>
        <li>
            <input type="radio" name="yard" value="no" id="yard" />No</li>
    </ul>
</div>

的JavaScript

$('#filter-rooms').on('change', 'input[type="checkbox"]', function () {

    var $ul = $(this).closest('ul'),
        vals = [];

    $ul.find('input:checked').each(function () {

        vals.push($(this).val());

    });

    vals = vals.join(",");

    window.location.assign('?rooms=' + vals);

});

现在,在上面显示的JavaScript中,我设法使room参数成功运行,但是当我为其他参数复制它时,它将使用rooms参数替换URL,而不是将其添加到URL的末尾像这样 - &bath=1&yard=yes

jsFiddle:http://jsfiddle.net/g9Laforb/1/ (注意:window.location.assign()缺失,因为jsFiddle不允许它。)

对此有任何建议将不胜感激。

3 个答案:

答案 0 :(得分:2)

首先,不要对多个元素使用相同的id。 见Why is it a bad thing to have multiple HTML elements with the same id attribute?

你的问题在于这一行

 window.location.assign('?rooms=' + vals);

您需要动态更新查询字符串。

使用此方法

function updateQueryStringParameter(uri, key, value) {
  var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
  var separator = uri.indexOf('?') !== -1 ? "&" : "?";
  if (uri.match(re)) {
    return uri.replace(re, '$1' + key + "=" + value + '$2');
  }
  else {
    return uri + separator + key + "=" + value;
  }
}

来自add or update query string parameter

和自定义属性,如

<ul data-type="rooms">

你可以做到

window.location.href = updateQueryStringParameter(window.location.href, $ul.attr('data-type'), vals);

而不是

window.location.assign('?rooms=' + vals);

答案 1 :(得分:1)

尝试此操作:定义变量以存储房间,浴室和院子选择的值,并在每个输入的更改处理程序中相应地创建URL。

roomVal = '';
bathVal = '';
yardVal = '';

$('#filter-rooms').on('change', 'input[type="checkbox"]', function () {
     roomVal = $(this).closest('ul').find('input[type="checkbox"]:checked').map(function(i,v){
        return $(this).val();
    }).get();

    window.location.assign('?rooms=' + roomVal + '&bath='+bathVal+"&yard="+yardVal);
});

$('#filter-bath').on('change', 'input[type="checkbox"]', function () {
     bathVal = $(this).closest('ul').find('input[type="checkbox"]:checked').map(function(i,v){
        return $(this).val();
    }).get();

    window.location.assign('?rooms=' + roomVal + '&bath='+bathVal+"&yard="+yardVal);
});

$('#filter-yard').on('change', 'input[type="radio"]', function () {
     yardVal = $(this).closest('ul').find('input[type="radio"]:checked').map(function(i,v){
        return $(this).val();
    }).get();

    window.location.assign('?rooms=' + roomVal + '&bath='+bathVal+"&yard="+yardVal);
});

<强> JSFiddle Demo

答案 2 :(得分:0)

您只需使用window.location.href即可 如果您在variable中存储了任何值,则可以使用+符号来连接值。

var somedata = somedata;

window.location.href = "http://www.yourwebsite.com?data1=somedata&data2="+somedata;