Как получить параметр и значения строки запроса с помощью javascript (Jquery)?

Нажми на меня

$('.clickme').click(function(event) {
event.preventDefault();
var stringId = $(this).attr("id");
    var mId = stringId.substring(2)
....

Я могу получить значение идентификатора, используя идентификатор элемента привязки. Я думаю, что я должен иметь возможность получить его прямо из href. Итак, как мне получить значение идентификатора и статуса из HREF (строка запроса URL)?

Я использую JQuery.

Спасибо за помощь.

ОБНОВЛЕНИЕ: Также как я могу получить все значения URL-адреса.. т.е. "test.php?id=100&blah=blah"?


person TigerTiger    schedule 23.07.2009    source источник
comment
Вам нужно подстроить его. Если вам нужен пример, оставьте комментарий.   -  person Josh Stodola    schedule 23.07.2009


Ответы (6)


Этот код:

function querySt(ji) {
    hu = $(".clickme").attr("href");
    gy = hu.split("&");
    for (i=0;i<gy.length;i++) {
        ft = gy[i].split("=");
        if (ft[0] == ji) {
            return ft[1];
        }
    }
}

Чтобы использовать его:

document.write(querySt("id"));
document.write(querySt("status"));

Ответ на ваше «обновление»:

http://ilovethecode.com/Javascript/Javascript-Tutorials-How_To-Easy/Get_Query_String_Using_Javascript.shtml

person Community    schedule 23.07.2009
comment
Хорошо .. так что я должен найти его через цикл for? Я думал, что могу получить к нему доступ напрямую... что-то вроде attr(status)!!! - person TigerTiger; 23.07.2009
comment
Теперь вы можете, просто выполните querySt(status); Я не думаю, что у jQuery есть встроенная функция для разбора URI. - person ; 23.07.2009
comment
Это будет работать для всего, кроме id. Ключом для использования этого кода будет test.php?id, а не id. Вам нужно сначала удалить все до ? затем разбить на амперсанды. - person tvanfosson; 23.07.2009
comment
Как насчет добавления туда некоторых вызовов decodeURIComponent? - person Ates Goral; 15.09.2009

var stringId = $(this).attr("id"); // this will return p_100
var stringId = $(this).attr("id").split('_')[1]; // this will return 100

var attr= $(this).attr("href"); // this will return all href attribute value

ОБНОВЛЕНИЕ

//href="test.php?id=100&status=pending&time=2009"
var attrFromAnchor= $(this).attr("href").split('?')[1].split('&')[0].split('=')[1]; // returns 100
person Elzo Valugi    schedule 23.07.2009
comment
спасибо за ваш ответ .. я могу получить значение из идентификатора элемента (уже сделано) .. но мне нужно получить его из URL-адреса привязки. - person TigerTiger; 23.07.2009

Здесь много хороших решений, но я решил опубликовать свое собственное. Вот небольшая функция, которую я собрал вместе, которая будет анализировать строку запроса в формате либо из window.location.search, либо из предоставленного значения строки поиска;

Он возвращает хэш пар значений идентификаторов, чтобы вы могли сослаться на него в виде:

var values = getQueryParams();
values['id']
values['blah']

Вот код:

/*
 This function assumes that the query string provided will
 contain a ? character before the query string itself.
 It will not work if the ? is not present.

 In addition, sites which don't use ? to delimit the start of the query string
 (ie. Google) won't work properly with this script.
 */
function getQueryParams( val ) {
    //Use the window.location.search if we don't have a val.
    var query = val || window.location.search;
    query = query.split('?')[1]
    var pairs = query.split('&');
    var retval = {};
    var check = [];
    for( var i = 0; i < pairs.length; i++ ) {
        check = pairs[i].split('=');
        retval[decodeURIComponent(check[0])] = decodeURIComponent(check[1]);
    }

    return retval;
}

Чтобы получить значение строки запроса из URL-адреса без разбора строки, вы можете сделать:

window.location.search.substr(1)

Если вы хотите, чтобы имя страницы перед ? вам все еще нужно сделать небольшой разбор строки:

var path = window.location.pathname.replace(/^.*\/(.*)$/,'$1');
var query = path + window.location.search;
//If your URL is http://www.myserver.com/some/long/path/big_long%20file.php?some=file&equals=me
//you will get: big_long%20file.php?some=file&equals=me

Надеюсь это поможет! Ваше здоровье.

person coderjoe    schedule 31.07.2009
comment
Эта реализация не учитывает имена и значения в кодировке URL. - person Ates Goral; 15.09.2009
comment
@Ates Goral, ты абсолютно прав. Он не принимает во внимание этот случай. Я обновил свое решение в соответствии с вашим предложением. - person coderjoe; 17.09.2009
comment
Также следует добавить условие, если после инициализации нет строки запроса, т.е. if (!query) return []; перед строкой query.split('?')[1] - person Brian Hogg; 12.03.2012

Вот краткая (но полная) реализация для получения ВСЕХ пар имя/значение из строки запроса:

function getQueryParams(qs) {
    qs = qs.split("+").join(" ");
    var params = {};
    var tokens;

    while (tokens = /[?&]?([^=]+)=([^&]*)/g.exec(qs)) {
        params[decodeURIComponent(tokens[1])]
            = decodeURIComponent(tokens[2]);
    }

    return params;
}

//var query = getQueryParams(document.location.search);
//alert(query.foo);
person Ates Goral    schedule 14.09.2009
comment
Однострочное регулярное выражение не работает с Safari и IE (бесконечный цикл). Исправление состоит в том, чтобы иметь отдельную строку для var pattern = /[?&]?([^=]+)=([^&]*)/g;, а затем использовать pattern.exec(qs). Кстати, для чего нужен qs.split('+')? Если URL-адрес закодирован, не должно быть знака плюс. - person Dingle; 14.05.2010

Нет необходимости в jQuery, это решение работает во всех браузерах:

function querySt(ji)
{
    hu = window.location.search.substring(1);
    gy = hu.split("&");
    for (i=0;i<gy.length;i++) {
    ft = gy[i].split("=");
    if (ft[0] == ji) {
    return ft[1];
    }
    }
    return "";
}
person Orhun Alp Oral    schedule 15.10.2012

Ответы здесь устарели.

См. это решение с использованием Vanilla JavaScript (ES5)

var qd = {}; // qd stands for query dict
document.getElementById("p_100")[0].href.split("?")[1].split("&").forEach(function(item) {var k = item.split("=")[0], v = decodeURIComponent(item.split("=")[1]); (k in qd) ? qd[k].push(v) : qd[k] = [v,]})

Мне нравится притворяться, что это oneliner, но мне сказали, что это не так. хмм... Да кто вообще стал бы разделять связанные вызовы функций на новые строки, верно?

пример:

"test.php?id=100&status=pending&time=2009"
> qd
id: ["100"]
status: ["pending"]
time: ["2009"]

// values can also be obtained like this
> qd.id[0]    // "100"
> qd["id"][0] // "100"

*Он возвращает массивы, так как оптимизирован для многозначных ключей. Посмотрите здесь фиктивные решения (без массивов).

примечание: чтобы научить старые браузеры новому .forEach, вы можете внедрить этот полифилл от Mozilla (MDN).

person Qwerty    schedule 20.01.2015