2012-01-17 16 views
47

tengo, por ejemplo, la siguiente URL almacenada en una variable global:La construcción de una URL con parámetros utilizando jQuery

var myUrl = "http://mydomain.com/something?row=1"; 

Entonces tiene una función para agregar digamos otro parámetro llamado " columna". ¿Cómo agregaría esa función parámetros a una cadena URL preexistente usando jQuery?

Ejemplo de la cadena generada esperada:

"http://mydomain.com/something?row=1&column=9" 

El problema es que myUrl también podría ser justo:

var myUrl = "http://mydomain.com/something"; 

(Nótese que no son pre-existentes parámetros)

+0

¿Para qué lo necesitas? –

+0

Hay un componente que necesita esa URL y tiene su propia manera de obtener datos mediante AJAX. –

Respuesta

45

Verifique la función jQuery .param(), eso debería ser el truco.

http://api.jquery.com/jQuery.param/

continuación, puede simplemente crear una función que añade la cadena generada por .PARAM() a una URL.

+15

¿Qué sucede si la cadena ya tiene parámetros? ¿O la cadena ya tiene parámetros con el mismo nombre? – ioquatix

+1

En ese caso, lo mejor es analizar el URL por adelantado y luego reconstruirlo más tarde con jQuery.param o similar. "La cadena es una estructura de datos rígida ..." – johncip

20

No es necesario jQuery, utilice una función como esta:

var buildUrl = function(base, key, value) { 
    var sep = (base.indexOf('?') > -1) ? '&' : '?'; 
    return base + sep + key + '=' + value; 
} 

que usaría así:

buildUrl('http://www.example.com/foo', 'test', '123'); 
buildUrl('http://www.example.com/foo?bar=baz', 'test', '123'); 
+0

Esto no tiene en cuenta que el parámetro ya podría existir. Sería obvio cuando lo invoque de la manera que lo hace en los ejemplos, pero no sería obvio cuando agrega parámetros a la URL cuando todos los parámetros provienen de otras variables. –

+3

Falta la codificación URL. – Suma

+0

Esto necesita codificación URL para la seguridad –

2

Puede probar esto.

myUrl += ((myUrl.indexOf('?') == -1) ? '?' : '&'); 
myUrl += "column=9"; 
-2
if (myUrl.indexOf("?") != -1){ 
    // contains query string 
} 
else 
{ 
    // doesn't 
} 
+0

Esta pregunta pregunta sobre la construcción de la cadena de consulta, no leyéndola. –

+0

No creo que hayas leído la pregunta. Se trata de detectar los parámetros de cadena de consulta. –

3

mantener todo en un objeto hasta que realmente necesita una cadena.

Primero rellenar el objeto de algunos valores iniciales:

var $_GET = location.search.substr(1).split("&").reduce(function(obj, val){ 
    if(!val) return obj; 
    var pair = val.split("="); 
    obj[pair[0]] = pair[1]; 
    return obj; 
}, {}); 

Considerando url inicial de: "http://mydomain.com/something?row=1&column=9"

$_GET['column'] = 5; 

$.param($_GET); //"row=1&column=5" 

Array#reduce

22
var myUrl = "http://mydomain.com/something"; 

function addQSParm(name, value) { 
    var re = new RegExp("([?&]" + name + "=)[^&]+", ""); 

    function add(sep) { 
     myUrl += sep + name + "=" + encodeURIComponent(value); 
    } 

    function change() { 
     myUrl = myUrl.replace(re, "$1" + encodeURIComponent(value)); 
    } 
    if (myUrl.indexOf("?") === -1) { 
     add("?"); 
    } else { 
     if (re.test(myUrl)) { 
      change(); 
     } else { 
      add("&"); 
     } 
    } 
} 

console.log(myUrl); 

addQSParm("foo", "asdf"); 
console.log(myUrl); 

addQSParm("bar", "qwerty"); 
console.log(myUrl); 

addQSParm("foo", "123"); 
console.log(myUrl); 

jsFiddle

+3

+1 Para 'encodeURIComponent'. :) –

+1

Gran respuesta. Completo, seguro y comprensible. –

+0

Usando la expresión regular '([? &]" + Name + "=) ([^ &] +)?' Funcionará mejor. Esto permite encontrar parámetros vacíos dentro de una URL. – RugerSR9

Cuestiones relacionadas