2011-10-03 13 views
5

Pertanto, desidero sostituire i valori delle variabili GET in un URL e se la variabile non esiste, quindi aggiungerla all'URL.Aggiunta/modifica stringa di query/variabili GET in un url con javascript

EDIT: sto facendo questo per un elementi href non le pagine posizione corrente ..

Io non sono bravo con javascript ma io so come usare jQuery abbastanza bene e le basi di javascript. So come scrivere regex ma non come usare la sintassi javascript di regex e con quali funzioni usarlo.

Ecco quello che ho finora e ha un errore sulla linea 3: vedere su jsfiddle (o al di sotto): 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: Non appena si cambia l'URL della pagina del browser permetterà di navigare in quella posizione, in modo da posso cambiarlo solo una volta. –

+1

Posso cambiarlo tutte le volte che voglio. Sto modificando gli elementi href e non la pagina. – MLM

risposta

14

Non è necessario utilizzare jQuery su questo. Le espressioni regolari e le funzioni di stringa sono sufficienti. Vedere il mio codice commentato di seguito:

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

Ed ecco the Fiddle

Aggiornamento:

Il codice gestisce ora il caso in cui v'è un hash sull'URL.

Modifica

saltata un caso! Il codice ora verifica se esiste una stringa di query in tutto.

+0

Grazie a un gruppo funziona alla grande! – MLM

+1

Aggiornato e aggiunto una funzione di lettura a questo violino. Ho usato (; | & | $) invece del tuo (& | $) - http://jsfiddle.net/MadLittleMods/4Pz8h/ – MLM

+1

Che ne dici di [\\? &] Invece di (\\? | \\ &) – Christophe

0

Vedi Change URL parameters. Risponde alla tua domanda in modo più generale (modificando qualsiasi parametro url). Ci sono soluzioni per jQuery e js regolari nella sezione delle risposte.

Sembra anche che url.replace dovrebbe essere location.replace ma potrei sbagliarmi (tale affermazione si basa su una ricerca rapida su google per "url.replace javascript").

+0

Questo è abbastanza vicino e immagino di dover usare il suo nuovo plugin chiamato BBQ: http://benalman.com/projects/jquery-bbq-plugin/ - che è per 1.4 jquery e sto usando 1.6.4 - e Sto usando questo URL (? Action = expand;) Il mio jquery sarebbe: http://jsfiddle.net/RVCyu/ - Sembra non funzionare – MLM

+0

Vedi 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

Non sto cercando di leggere i valori, sto cercando di modificarli/aggiungerli – 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>