За последние 24 часа нас посетили 18135 программистов и 1677 роботов. Сейчас ищут 1094 программиста ...

JS: редирект на ту же страницу с изменёнными GET параметрами

Тема в разделе "Решения, алгоритмы", создана пользователем Gromo, 10 дек 2010.

  1. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    JavaScript: редирект на ту же страницу с изменёнными GET параметрами
    Столкнулся с ситуацией, когда необходимо совершить редирект на ту же страницу, но с изменённым одним-двумя параметрами. Все остальные параметры должны остаться такими же, если указаны.

    Например, поисковая форма на сайте поиска товаров. В запросе выставляются параметры - ключевые слова, категория товара, региона, сортировка, текущая страница, кол-во товаров на страницу и т.д...

    При выводе результатов поиска зачастую необходимо произвести поиск по тем же параметрам, но с углублением в какую-либо категорию; либо же, к примеру, изменить порядок сортировки, или ещё что...

    После некоторого количества поисков в интернете, сделал фукнцию, которая производит редирект:

    [js]
    function isset(obj) {
    if (typeof(obj) !== 'undefined') return true;
    return false;
    }





    function parse_url(){
    // parse href link, returns object url { 'host':'', 'args':{} }
    // arguments is the assoc array key:value like { 'sortby':'price' }
    // multiple args like checkbox are set { 'ad_type': ['0', '1', '2'] }

    var url = { host: '', args: {} };

    var args = window.location.href.replace(/#.*/g, '').split('?');
    var params = isset(args[1]) ? args[1].split('&') : [];
    url['host'] = args[0];

    for(var i=0; i < params.length; i++){
    args = params.split('=');
    key = args[0];
    val = isset(args[1]) ? args[1] : '';

    if(key == '' || val == '') continue;

    // for multiple values like checkboxes
    if(isset(url['args'][key])){
    if(typeof url['args'][key] == 'string'){
    url['args'][key] = [url['args'][key], val];
    } else {
    url['args'][key].push(val);
    }
    } else {
    url['args'][key] = val;
    }
    }

    return url;
    }





    function redirect(values){
    // redirect to the page with changed arguments
    // values object example { 'limit':'20', 'start':'' }
    // all values should be quoted, even numbers !
    // empty value remove / set default argument
    // array value set multiple values (for checkboxes)

    if(!isset(values)) values = {};
    url = parse_url();

    for(var key in values){
    if(values[key] == ''){
    delete url['args'][key];
    } else {
    url['args'][key] = values[key];
    }
    }

    args = [];
    for(var key in url['args']){
    if(typeof url['args'][key] == 'string'){
    args.push( key + '=' + encodeURIComponent(url['args'][key]));
    } else {
    for(var i=0; i < url['args'][key].length; i++){
    args.push( key + '=' + encodeURIComponent(url['args'][key]));
    }
    }
    }

    url = args.length > 0 ? url['host'] + '?' + args.join('&') : url['host'];
    window.location.href = url;
    }
    [/js]


    функция parse_url производит разбор текущего адреса, и возвращает в виде массива, который можно использовать далее. Функция redirect производит собственно редирект с изменёнными параметрами.

    Пример использования:

    необходимо произвести поиск по тем же параметром, но в другой категории, и начать с первой страницы
    <a href="javascript:void(0)" onclick="redirect({ 'category': '24', 'page': '' })">Filter by cars</a>

    Функция редирект принимает ассоциативный массив параметров запроса в виде ключ-значение, которые заменяются в исходном адресе страницы, если имеются. Если не имеются - добавляются. Если значение равно пустой строке "" (в данном примере - page), то данное значение вообще удаляется из запроса (при наличии в запросе).

    Если в качестве значения передать массив, то значения этого массива будут использованы как checkboxes.

    Хотя большинство предпочитают делать это через серверный код, может кому пригодится и клиентский :)