2011-10-03 11 views
5

Así que estoy queriendo reemplazar los valores de las variables GET en una url y si la variable no existe, entonces agréguela a la url.Agregando/Modifica cadena de consulta/GET variables en una url con javascript

EDIT: Estoy haciendo esto a una serie de elementos href no las páginas ubicación actual ..

No soy bueno con javascript pero sí sé cómo usar jQuery bastante bien y los conceptos básicos de JavaScript. Sé cómo escribir expresiones regulares pero no cómo usar la sintaxis javascript de expresiones regulares y con qué funciones usarlo.

Esto es lo que tengo hasta ahora y que tiene un error en la línea 3: Ver en jsFiddle (o por debajo): http://jsfiddle.net/MadLittleMods/C93mD/

function addParameter(url, param, value) { 
    var pattern = new RegExp(param + '=(.*?);', 'gi'); 
    return url.replace(pattern, param + '=' + value + ';'); 

    alert(url); 
} 
+1

Nota: Tan pronto como se cambia la dirección URL de la página que el navegador vaya a esa ubicación, por lo que solo puede cambiarlo una vez –

+1

Puedo cambiarlo tantas veces como quiera. Estoy editando un elemento href, no la página. – MLM

Respuesta

14

No es necesario utilizar jQuery en este caso. Las expresiones regulares y las funciones de cadena son suficientes. Ver mi código comentado a continuación:

function addParameter(url, param, value) { 
    // Using a positive lookahead (?=\=) to find the 
    // given parameter, preceded by a ? or &, and followed 
    // by a = with a value after than (using a non-greedy selector) 
    // and then followed by a & or the end of the string 
    var val = new RegExp('(\\?|\\&)' + param + '=.*?(?=(&|$))'), 
     parts = url.toString().split('#'), 
     url = parts[0], 
     hash = parts[1] 
     qstring = /\?.+$/, 
     newURL = url; 

    // Check if the parameter exists 
    if (val.test(url)) 
    { 
     // if it does, replace it, using the captured group 
     // to determine & or ? at the beginning 
     newURL = url.replace(val, '$1' + param + '=' + value); 
    } 
    else if (qstring.test(url)) 
    { 
     // otherwise, if there is a query string at all 
     // add the param to the end of it 
     newURL = url + '&' + param + '=' + value; 
    } 
    else 
    { 
     // if there's no query string, add one 
     newURL = url + '?' + param + '=' + value; 
    } 

    if (hash) 
    { 
     newURL += '#' + hash; 
    } 

    return newURL; 
} 

Y aquí es the Fiddle

Actualización:

El código ahora maneja el caso en que existe un hash de la URL.

Editar

omitida un caso! El código ahora verifica si hay una cadena de consulta en total.

+0

¡Gracias, un montón funciona muy bien! – MLM

+1

Actualizado y agregado una función de lectura a este violín. Usé (; | & | $) en lugar de su (& | $) - http://jsfiddle.net/MadLittleMods/4Pz8h/ – MLM

+1

¿Qué tal [\\? &] En lugar de (\\? | \\ &) – Christophe

0

Ver Change URL parameters. Responde a su pregunta de una manera más general (cambiando cualquier parámetro de url). Hay soluciones tanto para jQuery como para js regulares en la sección de respuestas.

También parece que url.replace debería ser location.replace pero puedo estar equivocado (esa afirmación se basa en una búsqueda rápida en google de 'url.replace javascript').

+0

Esto es bastante cercano y supongo que necesito usar su nuevo complemento llamado BBQ: http://benalman.com/projects/jquery-bbq-plugin/ - que es para 1.4 jquery y estoy usando 1.6.4 - y Estoy usando esta url (? Action = expand;) Mi jquery sería: http://jsfiddle.net/RVCyu/ - No parece estar funcionando – MLM

+0

Ver http://www.netlobo.com/url_query_string_javascript.html o http://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html. – jtfairbank

+0

No estoy tratando de leer valores, estoy tratando de modificar/agregarlos – MLM

0
<script type="text/javascript"> 
    $(document).ready(function() { 
     $('input.letter').click(function() { 
      //0- prepare values 
      var qsTargeted = 'letter=' + this.value; //"letter=A"; 
      var windowUrl = ''; 
      var qskey = qsTargeted.split('=')[0]; 
      var qsvalue = qsTargeted.split('=')[1]; 
      //1- get row url 
      var originalURL = window.location.href; 
      //2- get query string part, and url 
      if (originalURL.split('?').length > 1) //qs is exists 
      { 
       windowUrl = originalURL.split('?')[0]; 
       var qs = originalURL.split('?')[1]; 
       //3- get list of query strings 
       var qsArray = qs.split('&'); 
       var flag = false; 
       //4- try to find query string key 
       for (var i = 0; i < qsArray.length; i++) { 
        if (qsArray[i].split('=').length > 0) { 
         if (qskey == qsArray[i].split('=')[0]) { 
          //exists key 
          qsArray[i] = qskey + '=' + qsvalue; 
          flag = true; 
          break; 
         } 
        } 
       } 
       if (!flag)// //5- if exists modify,else add 
       { 
        qsArray.push(qsTargeted); 
       } 
       var finalQs = qsArray.join('&'); 
       //6- prepare final url 
       window.location = windowUrl + '?' + finalQs; 
      } 
      else { 
       //6- prepare final url 
       //add query string 
       window.location = originalURL + '?' + qsTargeted; 
      } 
     }) 
    }); 
</script> 
Cuestiones relacionadas