¿Cómo obtener variables GET y POST con JQuery?

95

¿Cómo simplemente obtengo valores GETy POSTcon JQuery?

Lo que quiero hacer es algo como esto:

$('#container-1 > ul').tabs().tabs('select', $_GET('selectedTabIndex'));
Edward Tanguay
fuente

Respuestas:

170

Para los parámetros GET, puede obtenerlos de 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"]);

Para los parámetros POST, puede serializar el $_POSTobjeto en formato JSON en una <script>etiqueta:

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

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

Mientras lo hace (haciendo cosas en el lado del servidor), también puede recopilar los parámetros GET en PHP:

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

Nota: Necesitará PHP versión 5 o superior para usar la json_encodefunción incorporada.


Actualización: aquí hay una implementación más genérica:

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);
Ates Goral
fuente
3
Su método de extracción no considera argumentos sin valor (”? Foo & bar = baz“ => {foo: "", bar: "baz"}).
Gumbo
1
¡Buena captura de Gumbo! El = en la expresión regular debe hacerse opcional: ... snip ... (?: = ([^ &] *))? &?) / G
Ates Goral
1. Su primer ejemplo de GET no parece funcionar para mí. 2. En su actualización, el nombre de su función tiene un error tipográfico
Jake Wilson
¿Has intentado ejecutar eso en Safari o Chrome? Crea un bucle infinito y bloquea el navegador. Pruébelo con algo tan simple como "? P = 2"
MrColes
@MrColes: ¡Ay! Ha pasado un tiempo desde que escribí esto. Desde entonces, descubrí que Webkit no actualiza el contador de posición interno del objeto RegExp cuando se usa como literal. Actualizaré mi respuesta con la solución.
Ates Goral
16

Hay un complemento para jQuery para obtener parámetros GET llamados .getUrlParams

Para POST, la única solución es hacer eco del POST en una variable javascript usando PHP, como sugirió Moran.

Leandro Ardissone
fuente
6

¿Por qué no usar PHP antiguo? por ejemplo, digamos que recibimos un parámetro GET 'target':

function getTarget() {
    var targetParam = "<?php  echo $_GET['target'];  ?>";
    //alert(targetParam);
}
tony gil
fuente
7
Porque esta es la solución del lado del servidor, y la pregunta era sobre el lado del cliente / javascript / jQuery.
Hrvoje Kusulja
@hkusulja añadiendo insulto a la herida: aunque lo afirmas, todavía no veo que la pregunta sea exclusivamente del lado del servidor. me siento grueso como una herramienta ...
tony gil
1
Este guión es espantoso. Use esto si quiere que su sitio sea pirateado. ¡Siempre escapar de las variables ingresadas por el usuario! NO envíe $ _GET directamente.
charj
3

Con cualquier lenguaje del lado del servidor, tendrá que emitir las variables POST en javascript.

.RED

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

Solo tenga cuidado con los valores vacíos. Si la variable que intenta emitir está realmente vacía, obtendrá un error de sintaxis de JavaScript. Si sabe que es una cadena, debe envolverla entre comillas. Si es un número entero, es posible que desee probar para ver si realmente existe antes de escribir la línea en javascript.

En peligro de extinción
fuente
1
Sin embargo, no siempre tiene acceso a los idiomas del lado del servidor. Por ejemplo, páginas de GitHub ...
Adam B
2

Aquí hay algo para reunir todas las GETvariables en un objeto global, una rutina optimizada durante varios años. Desde el surgimiento de jQuery, ahora parece apropiado almacenarlos en jQuery, estoy consultando con John sobre una posible implementación central.

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('&'))
});

Uso de ejemplo:

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

Espero que esto ayude. ;)

Matt Gardner
fuente
1

Si su $ _GET es multidimensional, esto podría ser lo que desea:

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
fuente
1

simple, pero útil para obtener vars / valores de 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;
}

Lo encontré en algún lugar de Internet, solo solucioné algunos errores

Lukas Liesis
fuente
1

Utilice la siguiente función:

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;
};

y acceda a las variables como vars['index']where 'index'es el nombre de la variable get.

ashsam786
fuente
Este código falla para UTL como http://foo.com/?a=b#bar. Piensa que b#bares el valor para a.
MM
1

Mantenlo simple

reemplace VARIABLE_KEY con la clave de la variable para obtener su valor

 var get_value = window.location.href.match(/(?<=VARIABLE_KEY=)(.*?)[^&]+/)[0]; 
Kareem
fuente
0

Solo para que conste, quería saber la respuesta a esta pregunta, así que utilicé un método PHP:

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

De esa manera, todo mi javascript / jquery que se ejecuta después de esto puede acceder a todo en jGets. Creo que es una solución elegante y agradable.

Chud37
fuente
0

Mi acercamiento:

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
fuente