negrita - Analizar cadena de consulta en JavaScript
letra negrita en alert javascript (12)
Posible duplicado:
¿Cómo puedo obtener valores de cadena de consulta?
Necesito analizar la cadena de consulta www.mysite.com/default.aspx?dest=aboutus.aspx
. ¿Cómo obtengo la variable dest
en JavaScript?
¡Yo también! http://jsfiddle.net/drzaus/8EE8k/
(Nota: sin verificación anidada o duplicada)
deparam = function (querystring) {
// remove any preceding url and split
querystring = querystring.substring(querystring.indexOf(''?'')+1).split(''&'');
var params = {}, pair, d = decodeURIComponent;
// march and parse
for (var i = querystring.length - 1; i >= 0; i--) {
pair = querystring[i].split(''='');
params[d(pair[0])] = d(pair[1] || '''');
}
return params;
};//-- fn deparam
Y pruebas:
var tests = {};
tests["simple params"] = "ID=2&first=1&second=b";
tests["full url"] = "http://blah.com/?" + tests["simple params"];
tests[''just ?''] = ''?'' + tests[''simple params''];
var $output = document.getElementById(''output'');
function output(msg) {
$output.innerHTML += "/n" + Array.prototype.slice.call(arguments, 0).join("/n");
}
$.each(tests, function(msg, test) {
var q = deparam(test);
// prompt, querystring, result, reverse
output(msg, test, JSON.stringify(q), $.param(q));
output(''-------------------'');
});
Resultados en:
simple params
ID=2&first=1&second=b
{"second":"b","first":"1","ID":"2"}
second=b&first=1&ID=2
-------------------
full url
http://blah.com/?ID=2&first=1&second=b
{"second":"b","first":"1","ID":"2"}
second=b&first=1&ID=2
-------------------
just ?
?ID=2&first=1&second=b
{"second":"b","first":"1","ID":"2"}
second=b&first=1&ID=2
-------------------
¿Qué tal esto?
function getQueryVar(varName){
// Grab and unescape the query string - appending an ''&'' keeps the RegExp simple
// for the sake of this example.
var queryStr = unescape(window.location.search) + ''&'';
// Dynamic replacement RegExp
var regex = new RegExp(''.*?[&//?]'' + varName + ''=(.*?)&.*'');
// Apply RegExp to the query string
val = queryStr.replace(regex, "$1");
// If the string is the same, we didn''t find a match - return false
return val == queryStr ? false : val;
}
.. entonces solo llámalo con:
alert(''Var "dest" = '' + getQueryVar(''dest''));
Aclamaciones
Aquí está mi versión basada libremente en la versión de Braceyard anterior, pero analizándola en un ''diccionario'' y soporte para argumentos de búsqueda sin ''=''. En uso en mi función JQuery $ (documento) .ready (). Los argumentos se almacenan como pares clave / valor en argsParsed, que es posible que desee guardar en algún lugar ...
''use strict'';
function parseQuery(search) {
var args = search.substring(1).split(''&'');
var argsParsed = {};
var i, arg, kvp, key, value;
for (i=0; i < args.length; i++) {
arg = args[i];
if (-1 === arg.indexOf(''='')) {
argsParsed[decodeURIComponent(arg).trim()] = true;
}
else {
kvp = arg.split(''='');
key = decodeURIComponent(kvp[0]).trim();
value = decodeURIComponent(kvp[1]).trim();
argsParsed[key] = value;
}
}
return argsParsed;
}
parseQuery(document.location.search);
Aquí hay una manera rápida y fácil de analizar cadenas de consulta en JavaScript:
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split(''&'');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split(''='');
if (decodeURIComponent(pair[0]) == variable) {
return decodeURIComponent(pair[1]);
}
}
console.log(''Query variable %s not found'', variable);
}
Ahora haga una solicitud a page.html? X = Hola :
console.log(getQueryVariable(''x''));
Echa un vistazo a esta solución . Usando su función, simplemente no deberías llamar a gup(''dest'')
para tomar el parámetro dest
URL.
La siguiente función analizará la cadena de búsqueda con una expresión regular, almacenará en caché el resultado y devolverá el valor de la variable solicitada:
window.getSearch = function(variable) {
var parsedSearch;
parsedSearch = window.parsedSearch || (function() {
var match, re, ret;
re = //??(.*?)=([^/&]*)&?/gi;
ret = {};
while (match = re.exec(document.location.search)) {
ret[match[1]] = match[2];
}
return window.parsedSearch = ret;
})();
return parsedSearch[variable];
};
Puede llamarlo una vez sin ningún parámetro y trabajar con el objeto window.parsedSearch
, o llamar a getSearch
posteriormente. No he probado completamente esto, la expresión regular podría necesitar algunos ajustes ...
Luego de mi comentario a la respuesta que @bobby publicó, aquí está el código que usaría:
function parseQuery(str)
{
if(typeof str != "string" || str.length == 0) return {};
var s = str.split("&");
var s_length = s.length;
var bit, query = {}, first, second;
for(var i = 0; i < s_length; i++)
{
bit = s[i].split("=");
first = decodeURIComponent(bit[0]);
if(first.length == 0) continue;
second = decodeURIComponent(bit[1]);
if(typeof query[first] == "undefined") query[first] = second;
else if(query[first] instanceof Array) query[first].push(second);
else query[first] = [query[first], second];
}
return query;
}
Este código toma la cadena de consulta proporcionada (como ''str'') y devuelve un objeto. La cadena se divide en todas las apariciones de &, lo que resulta en una matriz. la matriz se transmite y cada elemento se divide por "=". Esto da lugar a matrices secundarias en las que el elemento 0 es el parámetro y el primer elemento es el valor (o indefinido si no = signo). Estos se asignan a las propiedades del objeto, por lo que, por ejemplo, la cadena "hola = 1 y otra = 2 y algo" se convierte en:
{
hello: "1",
another: "2",
something: undefined
}
Además, este código advierte repeticiones de repeticiones como "hello = 1 & hello = 2" y convierte el resultado en una matriz, por ejemplo:
{
hello: ["1", "2"]
}
También notará que se trata de casos en los que no se usa el signo =. También ignora si hay un signo igual justo después de un símbolo &.
Un poco exagerado para la pregunta original, pero una solución reutilizable si alguna vez necesitas trabajar con cadenas de consulta en javascript :)
Quería recoger enlaces específicos dentro de un elemento DOM en una página, enviar a esos usuarios a una página de redireccionamiento en un temporizador y luego pasarlos a la URL original en la que se hizo clic. Así es como lo hice usando un javascript normal que incorpora uno de los métodos anteriores.
Página con enlaces: Head
function replaceLinks() {
var content = document.getElementById(''mainContent'');
var nodes = content.getElementsByTagName(''a'');
for (var i = 0; i < document.getElementsByTagName(''a'').length; i++) {
{
href = nodes[i].href;
if (href.indexOf("thisurl.com") != -1) {
nodes[i].href="http://www.thisurl.com/redirect.aspx" + "?url=" + nodes[i];
nodes[i].target="_blank";
}
}
}
}
Cuerpo
<body onload="replaceLinks()">
Página de redireccionamiento
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split(''&'');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split(''='');
if (decodeURIComponent(pair[0]) == variable) {
return decodeURIComponent(pair[1]);
}
}
console.log(''Query variable %s not found'', variable);
}
function delayer(){
window.location = getQueryVariable(''url'')
}
Cuerpo
<body onload="setTimeout(''delayer()'', 1000)">
Quería una función simple que tomara una URL como entrada y devolviera un mapa de los parámetros de consulta. Si tuviera que mejorar esta función, admitiría el estándar para datos de matriz en la URL y / o variables anidadas.
Esto debería funcionar de nuevo y para con la función jQuery.param (qparams).
function getQueryParams(url){
var qparams = {},
parts = (url||'''').split(''?''),
qparts, qpart,
i=0;
if(parts.length <= 1 ){
return qparams;
}else{
qparts = parts[1].split(''&'');
for(i in qparts){
qpart = qparts[i].split(''='');
qparams[decodeURIComponent(qpart[0])] =
decodeURIComponent(qpart[1] || '''');
}
}
return qparams;
};
Si sabe que solo tendrá esa única variable de cadena de consulta, simplemente puede hacer:
var dest = location.search.replace(/^.*?/=/, '''');
También puede utilizar la excelente biblioteca URI.js de Rodney Rehm . Así es cómo:-
var qs = URI(''www.mysite.com/default.aspx?dest=aboutus.aspx'').query(true); // == { dest : ''aboutus.aspx'' }
alert(qs.dest); // == aboutus.aspx
Y para analizar la cadena de consulta de la página actual: -
var $_GET = URI(document.URL).query(true); // ala PHP
alert($_GET[''dest'']); // == aboutus.aspx
function parseQuery(queryString) {
var query = {};
var pairs = (queryString[0] === ''?'' ? queryString.substr(1) : queryString).split(''&'');
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split(''='');
query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '''');
}
return query;
}
Convierte la cadena de consulta como hello=1&another=2
en el objeto {hello: 1, another: 2}
. A partir de ahí, es fácil extraer la variable que necesitas.
Dicho esto, no trata con casos de matrices como "hello=1&hello=2&hello=3"
. Para trabajar con esto, debes verificar si existe una propiedad del objeto que creas antes de agregarlo, y convertir su valor en una matriz, empujando cualquier bit adicional.