как получить переменные GET и POST с помощью JQuery?

96

Как просто получить GETи POSTзначение с JQuery?

Я хочу сделать что-то вроде этого:

$('#container-1 > ul').tabs().tabs('select', $_GET('selectedTabIndex'));
Эдвард Тангуай
источник

Ответы:

171

Для параметров GET вы можете получить их из document.location.search:

var $_GET = {};

document.location.search.replace(/\??(?:([^=]+)=([^&]*)&?)/g, function () {
    function decode(s) {
        return decodeURIComponent(s.split("+").join(" "));
    }

    $_GET[decode(arguments[1])] = decode(arguments[2]);
});

document.write($_GET["test"]);

Для параметров POST вы можете сериализовать $_POSTобъект в формате JSON в <script>тег:

<script type="text/javascript">
var $_POST = <?php echo json_encode($_POST); ?>;

document.write($_POST["test"]);
</script>

Пока вы занимаетесь этим (делаете что-то на стороне сервера), вы также можете собирать параметры GET на PHP:

var $_GET = <?php echo json_encode($_GET); ?>;

Примечание. Для использования встроенной json_encodeфункции вам потребуется PHP версии 5 или выше .


Обновление: вот более общая реализация:

function getQueryParams(qs) {
    qs = qs.split("+").join(" ");
    var params = {},
        tokens,
        re = /[?&]?([^=]+)=([^&]*)/g;

    while (tokens = re.exec(qs)) {
        params[decodeURIComponent(tokens[1])]
            = decodeURIComponent(tokens[2]);
    }

    return params;
}

var $_GET = getQueryParams(document.location.search);
Атес Горал
источник
3
Ваш метод извлечения не рассматривает аргументы без значения (”? Foo & bar = baz“ => {foo: "", bar: "baz"}).
Gumbo
1
Хороший улов, Гамбо! Знак = в регулярном выражении следует сделать необязательным: ... snip ... (?: = ([^ &] *))? &?) / G
Ates Goral
1. Ваш первый пример GET, похоже, мне не подходит. 2. В вашем обновлении имя вашей функции содержит опечатку
Джейк Уилсон,
Вы пробовали запустить это в сафари или в Chrome? Это создает бесконечный цикл и приводит к сбою браузера. Попробуйте это с чем-нибудь таким простым, как "? P = 2"
MrColes
@ Мистер Колз: Ой. Я давно не писал это. С тех пор я обнаружил, что Webkit не обновляет внутренний счетчик позиции объекта RegExp, когда он используется как литерал. Я обновлю свой ответ исправлением.
Атес Горал
16

Есть плагин для jQuery для получения параметров GET под названием .getUrlParams

Для POST единственным решением является отображение POST в переменной javascript с использованием PHP, как предложил Моран.

Леандро Ардиссоне
источник
6

почему бы не использовать старый добрый PHP? например, предположим, что мы получили параметр GET 'target':

function getTarget() {
    var targetParam = "<?php  echo $_GET['target'];  ?>";
    //alert(targetParam);
}
Тони Гил
источник
7
Потому что это решение на стороне сервера, и вопрос касался стороны клиента / javascript / jQuery.
Hrvoje Kusulja
@hkusulja добавляет оскорбление к травме: даже если вы это утверждаете, я все равно не понимаю, что вопрос исключительно на стороне сервера. я чувствую себя толстым как инструмент ...
Тони Гил
1
Этот сценарий ужасен. Используйте это, если хотите, чтобы ваш сайт взломали. Всегда избегайте переменных, вводимых пользователем !! НЕ выводите $ _GET напрямую.
charj 05
5

Или вы можете использовать этот http://plugins.jquery.com/project/parseQuery , он меньше большинства (минимизированный 449 байт), возвращает объект, представляющий пары имя-значение.


источник
3

С любым серверным языком вам нужно будет передать переменные POST в javascript.

.СЕТЬ

var my_post_variable = '<%= Request("post_variable") %>';

Только будьте осторожны с пустыми значениями. Если переменная, которую вы пытаетесь создать, на самом деле пуста, вы получите синтаксическую ошибку javascript. Если вы знаете, что это строка, вам следует заключить ее в кавычки. Если это целое число, вы можете проверить, существует ли оно на самом деле, прежде чем записывать строку в javascript.

Под угрозой исчезновения
источник
1
Однако у вас не всегда есть доступ к серверным языкам. Например, страницы GitHub ...
Adam B
2

Здесь есть что-то, чтобы собрать все GETпеременные в глобальный объект, процедура, оптимизированная за несколько лет. С появлением jQuery теперь кажется целесообразным хранить их в самом jQuery, я проверяю с Джоном возможную базовую реализацию.

jQuery.extend({
    'Q' : window.location.search.length <= 1 ? {}
        : function(a){
            var i = a.length, 
                r = /%25/g,  // Ensure '%' is properly represented 
                h = {};      // (Safari auto-encodes '%', Firefox 1.5 does not)
            while(i--) {
                var p = a[i].split('=');
                h[ p[0] ] = r.test( p[1] ) ? decodeURIComponent( p[1] ) : p[1];
            }
            return h;
        }(window.location.search.substr(1).split('&'))
});

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

switch ($.Q.event) {
    case 'new' :
        // http://www.site.com/?event=new
        $('#NewItemButton').trigger('click');
        break;
    default :
}

Надеюсь это поможет. ;)

Мэтт Гарднер
источник
1

Если ваш $ _GET многомерный, это может быть то, что вам нужно:

var $_GET = {};
document.location.search.replace(/\??(?:([^=]+)=([^&]*)&?)/g, function () {
    function decode(s) {
            return decodeURIComponent(s.split("+").join(" "));
    }

    //handling for multidimensional arrays
    if(decode(arguments[1]).indexOf("[]") > 0){
        var newName = decode(arguments[1]).substring(0, decode(arguments[1]).length - 2);
        if(typeof $_GET[newName] == 'undefined'){
            $_GET[newName] = new Array();
        }
        $_GET[newName].push(decode(arguments[2]));
    }else{
        $_GET[decode(arguments[1])] = decode(arguments[2]);
    }
});
WoodyNaDobhar
источник
1

просто, но все же полезно получить переменные / значения из URL:

function getUrlVars() {
    var vars = [], hash, hashes = null;
    if (window.location.href.indexOf("?") && window.location.href.indexOf("&")) {
        hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    } else if (window.location.href.indexOf("?")) {
        hashes = window.location.href.slice(window.location.href.indexOf('?') + 1);
    }
    if (hashes != null) {
        for (var i = 0; i < hashes.length; i++) {
            hash = hashes[i].split('=');
            vars[hash[0]] = hash[1];
        }
    }
    return vars;
}

Я нашел это где-то в Интернете, только что исправил несколько ошибок

Лукас Лисис
источник
1

Используйте следующую функцию:

var splitUrl = function() {
    var vars = [], hash;
    var url = document.URL.split('?')[0];
    var p = document.URL.split('?')[1];
    if(p != undefined){
        p = p.split('&');
        for(var i = 0; i < p.length; i++){
            hash = p[i].split('=');
            vars.push(hash[1]);
            vars[hash[0]] = hash[1];
        }
    }
    vars['url'] = url;
    return vars;
};

и получить доступ к переменным, как vars['index']где 'index'- имя переменной get.

ашсам786
источник
Этот код не работает для таких UTL, как http://foo.com/?a=b#bar. Он считает, что b#barэто ценность a.
MM
1

Будь проще

замените VARIABLE_KEY ключом переменной, чтобы получить ее значение

 var get_value = window.location.href.match(/(?<=VARIABLE_KEY=)(.*?)[^&]+/)[0]; 
Карим
источник
0

Для записи я хотел узнать ответ на этот вопрос, поэтому использовал метод PHP:

<script>
var jGets = new Array ();
<?
if(isset($_GET)) {
    foreach($_GET as $key => $val)
        echo "jGets[\"$key\"]=\"$val\";\n";
}
?>
</script>

Таким образом, весь мой javascript / jquery, который запускается после этого, может получить доступ ко всему в jGets. Мне кажется, это красивое элегантное решение.

Чудь37
источник
0

Мой подход:

var urlParams;
(window.onpopstate = function () {
var match,
      pl     = /\+/g,  Regex for replacing addition symbol with a space
       search = /([^&=]+)=?([^&]*)/g,
      decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
       query  = window.location.search.substring(1);
   urlParams = {};
   while (match = search.exec(query))
    urlParams[decode(match[1])] = decode(match[2]);
})();
otaxige_aol
источник