it-swarm.dev

Come posso aggiungere o aggiornare un parametro stringa di query?

Con javascript come posso aggiungere un parametro stringa di query all'URL se non presente o se presente, aggiorna il valore corrente? Sto usando jquery per lo sviluppo del mio lato client.

313
amateur

Ho scritto la seguente funzione che realizza ciò che voglio ottenere:

function updateQueryStringParameter(uri, key, value) {
  var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
  var separator = uri.indexOf('?') !== -1 ? "&" : "?";
  if (uri.match(re)) {
    return uri.replace(re, '$1' + key + "=" + value + '$2');
  }
  else {
    return uri + separator + key + "=" + value;
  }
}
431
amateur

Ho espanso la soluzione e l'ho combinata con un'altra che ho trovato per sostituire/aggiornare/rimuovere i parametri di querystring basati sull'input degli utenti e tenendo in considerazione l'ancoraggio degli url.

Non fornire un valore rimuoverà il parametro, fornendone uno si aggiungerà/aggiornerà il parametro. Se non viene fornito alcun URL, verrà afferrato da window.location

function UpdateQueryString(key, value, url) {
    if (!url) url = window.location.href;
    var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"),
        hash;

    if (re.test(url)) {
        if (typeof value !== 'undefined' && value !== null)
            return url.replace(re, '$1' + key + "=" + value + '$2$3');
        else {
            hash = url.split('#');
            url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
            if (typeof hash[1] !== 'undefined' && hash[1] !== null) 
                url += '#' + hash[1];
            return url;
        }
    }
    else {
        if (typeof value !== 'undefined' && value !== null) {
            var separator = url.indexOf('?') !== -1 ? '&' : '?';
            hash = url.split('#');
            url = hash[0] + separator + key + '=' + value;
            if (typeof hash[1] !== 'undefined' && hash[1] !== null) 
                url += '#' + hash[1];
            return url;
        }
        else
            return url;
    }
}

Aggiornare

Si è verificato un errore durante la rimozione del primo parametro in querystring, ho rielaborato la regex e ho provato a includere una correzione.

Secondo aggiornamento

Come suggerito da @ JarónBarends - Controllo del valore di Tweak per verificare rispetto a undefined e null per consentire l'impostazione dei valori 0

Terzo aggiornamento

C'è stato un bug nel rimuovere una variabile di querystring direttamente prima che un hashtag avrebbe perso il simbolo dell'hashtag che è stato corretto

Quarto aggiornamento

Grazie @rooby per indicare l'ottimizzazione delle espressioni regolari nel primo oggetto RegExp . Impostare l'espressione regolare iniziale su ([? &]) A causa del problema con l'utilizzo di (\? | &) Trovato da @YonatanKarni

Quinto aggiornamento

Rimozione dichiarando hash var in if/else statement

175
ellemayo

Il URLSearchParams utility può essere utile per questo in combinazione con window.location.search. Per esempio:

if ('URLSearchParams' in window) {
    var searchParams = new URLSearchParams(window.location.search);
    searchParams.set("foo", "bar");
    window.location.search = searchParams.toString();
}

Ora foo è stata impostata su bar indipendentemente dal fatto che esistesse o meno. 

Tuttavia, l'assegnazione sopra a window.location.search causerà il caricamento di una pagina, quindi se non è consigliabile utilizzare l'API History come segue:

if ('URLSearchParams' in window) {
    var searchParams = new URLSearchParams(window.location.search)
    searchParams.set("foo", "bar");
    var newRelativePathQuery = window.location.pathname + '?' + searchParams.toString();
    history.pushState(null, '', newRelativePathQuery);
}

Ora non è necessario scrivere la propria espressione regolare o logica per gestire la possibile esistenza di stringhe di query. 

Tuttavia, il supporto del browser è scadente poiché è attualmente sperimentale e solo in uso nelle recenti versioni di Chrome, Firefox, Safari, iOS Safari, Browser Android, Android Chrome e Opera. Usa con polyfill se decidi di usarlo.

Aggiornamento: Il supporto del browser è migliorato dalla mia risposta originale.

In base alla risposta di @amatore (e ora incorporando la correzione dal commento @j_walker_dev), ma tenendo conto del commento sui tag hash nell'URL, utilizzo quanto segue:

function updateQueryStringParameter(uri, key, value) {
  var re = new RegExp("([?&])" + key + "=.*?(&|#|$)", "i");
  if (uri.match(re)) {
    return uri.replace(re, '$1' + key + "=" + value + '$2');
  } else {
    var hash =  '';
    if( uri.indexOf('#') !== -1 ){
        hash = uri.replace(/.*#/, '#');
        uri = uri.replace(/#.*/, '');
    }
    var separator = uri.indexOf('?') !== -1 ? "&" : "?";    
    return uri + separator + key + "=" + value + hash;
  }
}

Modificato per correggere [?|&] in regex che dovrebbe ovviamente essere [?&] come indicato nei commenti

Modifica: versione alternativa per supportare anche la rimozione dei parametri URL. Ho usato value === undefined come modo per indicare la rimozione. Potrebbe usare value === false o anche un parametro di ingresso separato come desiderato.

function updateQueryStringParameter(uri, key, value) {
  var re = new RegExp("([?&])" + key + "=.*?(&|#|$)", "i");
  if( value === undefined ) {
    if (uri.match(re)) {
        return uri.replace(re, '$1$2');
    } else {
        return uri;
    }
  } else {
    if (uri.match(re)) {
        return uri.replace(re, '$1' + key + "=" + value + '$2');
    } else {
    var hash =  '';
    if( uri.indexOf('#') !== -1 ){
        hash = uri.replace(/.*#/, '#');
        uri = uri.replace(/#.*/, '');
    }
    var separator = uri.indexOf('?') !== -1 ? "&" : "?";    
    return uri + separator + key + "=" + value + hash;
  }
  }  
}

Guardalo in azione su https://jsfiddle.net/bp3tmuxh/1/

41
Adam

Ecco la mia biblioteca per farlo: https://github.com/Mikhus/jsurl

var u = new Url;
u.query.param='value'; // adds or replaces the param
alert(u)
20
Mikhus

window.location.search è di lettura/scrittura.

Tuttavia, la modifica della stringa di query reindirizzerà la pagina attiva e causerà un aggiornamento dal server.

Se quello che stai tentando di fare è mantenere lo stato lato client (e potenzialmente renderlo in grado di creare un segnalibro), ti consigliamo di modificare l'hash dell'URL anziché la stringa di query, che ti mantiene sulla stessa pagina (window.location. hash è in lettura/scrittura). Questo è il modo in cui i siti web come Twitter.com fanno questo.

Dovrai anche il pulsante Indietro per funzionare, dovrai associare eventi javascript all'evento di modifica hash, un buon plugin per questo è http://benalman.com/projects/jquery-hashchange-plugin/

10
Gal

Ecco il mio approccio: la funzione location.params() (mostrata sotto) può essere usata come getter o setter. Esempi:

Dato l'URL http://example.com/?foo=bar&baz#some-hash,

  1. location.params() restituirà un oggetto con tutti i parametri di query: {foo: 'bar', baz: true}.
  2. location.params('foo') restituirà 'bar'.
  3. location.params({foo: undefined, hello: 'world', test: true}) cambierà l'URL in http://example.com/?baz&hello=world&test#some-hash.

Ecco la funzione params(), che può facoltativamente essere assegnata all'oggetto window.location.

location.params = function(params) {
  var obj = {}, i, parts, len, key, value;

  if (typeof params === 'string') {
    value = location.search.match(new RegExp('[?&]' + params + '=?([^&]*)[&#$]?'));
    return value ? value[1] : undefined;
  }

  var _params = location.search.substr(1).split('&');

  for (i = 0, len = _params.length; i < len; i++) {
    parts = _params[i].split('=');
    if (! parts[0]) {continue;}
    obj[parts[0]] = parts[1] || true;
  }

  if (typeof params !== 'object') {return obj;}

  for (key in params) {
    value = params[key];
    if (typeof value === 'undefined') {
      delete obj[key];
    } else {
      obj[key] = value;
    }
  }

  parts = [];
  for (key in obj) {
    parts.Push(key + (obj[key] === true ? '' : '=' + obj[key]));
  }

  location.search = parts.join('&');
};
9
jake

Se non è impostato o vuoi aggiornarlo con un nuovo valore puoi usare:

window.location.search = 'param=value'; // or param=new_value

Questo è in Javascript semplice, a proposito.

MODIFICARE

Potresti provare a usare jquery oggetto-query plugin

window.location.search = jQuery.query.set ("param", 5);

8
tradyblix

Mi rendo conto che questa domanda è vecchia ed è stata data una risposta alla morte, ma ecco la mia pugnalata. Sto cercando di reinventare la ruota qui perché stavo usando la risposta attualmente accettata e la cattiva gestione dei frammenti di URL mi ha recentemente morso in un progetto.

La funzione è sotto. È piuttosto lungo, ma è stato fatto per essere il più resistente possibile. Mi piacerebbe suggerimenti per accorciarlo/migliorarlo. Ho creato una piccola jsFiddle test suite per esso (o altre funzioni simili). Se una funzione può superare tutti i test, dico che probabilmente è una buona idea.

Aggiornamento: mi sono imbattuto in una funzione interessante per utilizzando il DOM per analizzare gli URL , quindi ho incorporato questa tecnica qui. Rende la funzione più breve e più affidabile. Puntelli all'autore di quella funzione.

/**
 * Add or update a query string parameter. If no URI is given, we use the current
 * window.location.href value for the URI.
 * 
 * Based on the DOM URL parser described here:
 * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
 *
 * @param   (string)    uri     Optional: The URI to add or update a parameter in
 * @param   (string)    key     The key to add or update
 * @param   (string)    value   The new value to set for key
 *
 * Tested on Chrome 34, Firefox 29, IE 7 and 11
 */
function update_query_string( uri, key, value ) {

    // Use window URL if no query string is provided
    if ( ! uri ) { uri = window.location.href; }

    // Create a dummy element to parse the URI with
    var a = document.createElement( 'a' ), 

        // match the key, optional square brackets, an equals sign or end of string, the optional value
        reg_ex = new RegExp( key + '((?:\\[[^\\]]*\\])?)(=|$)(.*)' ),

        // Setup some additional variables
        qs,
        qs_len,
        key_found = false;

    // Use the JS API to parse the URI 
    a.href = uri;

    // If the URI doesn't have a query string, add it and return
    if ( ! a.search ) {

        a.search = '?' + key + '=' + value;

        return a.href;
    }

    // Split the query string by ampersands
    qs = a.search.replace( /^\?/, '' ).split( /&(?:amp;)?/ );
    qs_len = qs.length; 

    // Loop through each query string part
    while ( qs_len > 0 ) {

        qs_len--;

        // Remove empty elements to prevent double ampersands
        if ( ! qs[qs_len] ) { qs.splice(qs_len, 1); continue; }

        // Check if the current part matches our key
        if ( reg_ex.test( qs[qs_len] ) ) {

            // Replace the current value
            qs[qs_len] = qs[qs_len].replace( reg_ex, key + '$1' ) + '=' + value;

            key_found = true;
        }
    }   

    // If we haven't replaced any occurrences above, add the new parameter and value
    if ( ! key_found ) { qs.Push( key + '=' + value ); }

    // Set the new query string
    a.search = '?' + qs.join( '&' );

    return a.href;
}
7
Dominic P

Questa è la mia preferenza, e copre i casi che riesco a pensare. Qualcuno può pensare a un modo per ridurlo a una singola sostituzione?

function setParam(uri, key, val) {
    return uri
        .replace(RegExp("([?&]"+key+"(?=[=&#]|$)[^#&]*|(?=#|$))"), "&"+key+"="+encodeURIComponent(val))
        .replace(/^([^?&]+)&/, "$1?");
}
6
Adam Leggett

So che questo è abbastanza vecchio, ma voglio licenziare la mia versione di lavoro qui.

function addOrUpdateUrlParam(uri, paramKey, paramVal) {
  var re = new RegExp("([?&])" + paramKey + "=[^&#]*", "i");
  if (re.test(uri)) {
    uri = uri.replace(re, '$1' + paramKey + "=" + paramVal);
  } else {
    var separator = /\?/.test(uri) ? "&" : "?";
    uri = uri + separator + paramKey + "=" + paramVal;
  }
  return uri;
}

jQuery(document).ready(function($) {
  $('#paramKey,#paramValue').on('change', function() {
    if ($('#paramKey').val() != "" && $('#paramValue').val() != "") {
      $('#uri').val(addOrUpdateUrlParam($('#uri').val(), $('#paramKey').val(), $('#paramValue').val()));
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input style="width:100%" type="text" id="uri" value="http://www.example.com/text.php">
<label style="display:block;">paramKey
  <input type="text" id="paramKey">
</label>
<label style="display:block;">paramValue
  <input type="text" id="paramValue">
</label>

NOTEQuesta è una versione modificata di @elreimundo

5
Paolo Falomo

In base alla risposta di @ellemayo, ho trovato la seguente soluzione che consente di disabilitare il tag hash se lo si desidera:

function updateQueryString(key, value, options) {
    if (!options) options = {};

    var url = options.url || location.href;
    var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"), hash;

    hash = url.split('#');
    url = hash[0];
    if (re.test(url)) {
        if (typeof value !== 'undefined' && value !== null) {
            url = url.replace(re, '$1' + key + "=" + value + '$2$3');
        } else {
            url = url.replace(re, '$1$3').replace(/(&|\?)$/, '');
        }
    } else if (typeof value !== 'undefined' && value !== null) {
        var separator = url.indexOf('?') !== -1 ? '&' : '?';
        url = url + separator + key + '=' + value;
    }

    if ((typeof options.hash === 'undefined' || options.hash) &&
        typeof hash[1] !== 'undefined' && hash[1] !== null)
        url += '#' + hash[1];
    return url;
}

Chiamalo così:

updateQueryString('foo', 'bar', {
    url: 'http://my.example.com#hash',
    hash: false
});

Risultati in:

http://my.example.com?foo=bar
2
RuubW

Ecco una versione più breve che si prende cura di 

  • query con o senza un dato parametro
  • interrogare con più valori di parametro
  • query contenente hash

Codice:

var setQueryParameter = function(uri, key, value) {
  var re = new RegExp("([?&])("+ key + "=)[^&#]*", "g");
  if (uri.match(re)) 
    return uri.replace(re, '$1$2' + value);

  // need to add parameter to URI
  var paramString = (uri.indexOf('?') < 0 ? "?" : "&") + key + "=" + value;
  var hashIndex = uri.indexOf('#');
  if (hashIndex < 0)
    return uri + paramString;
  else
    return uri.substring(0, hashIndex) + paramString + uri.substring(hashIndex);
}

La descrizione regex può essere trovata qui .

NOTE: questa soluzione è basata sulla risposta @amateur, ma con molti miglioramenti.

2
MaxZoom

My take from here (compatibile con "use strict", in realtà non utilizza jQuery):

function decodeURIParams(query) {
  if (query == null)
    query = window.location.search;
  if (query[0] == '?')
    query = query.substring(1);

  var params = query.split('&');
  var result = {};
  for (var i = 0; i < params.length; i++) {
    var param = params[i];
    var pos = param.indexOf('=');
    if (pos >= 0) {
        var key = decodeURIComponent(param.substring(0, pos));
        var val = decodeURIComponent(param.substring(pos + 1));
        result[key] = val;
    } else {
        var key = decodeURIComponent(param);
        result[key] = true;
    }
  }
  return result;
}

function encodeURIParams(params, addQuestionMark) {
  var pairs = [];
  for (var key in params) if (params.hasOwnProperty(key)) {
    var value = params[key];
    if (value != null) /* matches null and undefined */ {
      pairs.Push(encodeURIComponent(key) + '=' + encodeURIComponent(value))
    }
  }
  if (pairs.length == 0)
    return '';
  return (addQuestionMark ? '?' : '') + pairs.join('&');
}

//// alternative to $.extend if not using jQuery:
// function mergeObjects(destination, source) {
//   for (var key in source) if (source.hasOwnProperty(key)) {
//     destination[key] = source[key];
//   }
//   return destination;
// }

function navigateWithURIParams(newParams) {
  window.location.search = encodeURIParams($.extend(decodeURIParams(), newParams), true);
}

Esempio di utilizzo:

// add/update parameters
navigateWithURIParams({ foo: 'bar', boz: 42 });

// remove parameter
navigateWithURIParams({ foo: null });

// submit the given form by adding/replacing URI parameters (with jQuery)
$('.filter-form').submit(function(e) {
  e.preventDefault();
  navigateWithURIParams(decodeURIParams($(this).serialize()));
});
2

Utilizzare questa funzione per aggiungere, rimuovere e modificare il parametro della stringa di query dall'URL basato su jquery

/**
@param String url
@param object param {key: value} query parameter
*/
function modifyURLQuery(url, param){
    var value = {};

    var query = String(url).split('?');

    if (query[1]) {
        var part = query[1].split('&');

        for (i = 0; i < part.length; i++) {
            var data = part[i].split('=');

            if (data[0] && data[1]) {
                value[data[0]] = data[1];
            }
        }
    }

    value = $.extend(value, param);

    // Remove empty value
    for (i in value){
        if(!value[i]){
            delete value[i];
        }
    }

    // Return url with modified parameter
    if(value){
        return query[0] + '?' + $.param(value);
    } else {
        return query[0];
    }
}

Aggiungi nuovo e modifica i parametri esistenti nell'URL

var new_url = modifyURLQuery("http://google.com?foo=34", {foo: 50, bar: 45});
// Result: http://google.com?foo=50&bar=45

Rimuovi esistente

var new_url = modifyURLQuery("http://google.com?foo=50&bar=45", {bar: null});
// Result: http://google.com?foo=50
1
jay padaliya

Un approccio diverso senza usare le espressioni regolari . Supporta gli ancoraggi 'hash' alla fine dell'URL così come i vari punti interrogativi (?). Dovrebbe essere leggermente più veloce rispetto all'approccio di espressione regolare.

function setUrlParameter(url, key, value) {
  var parts = url.split("#", 2), anchor = parts.length > 1 ? "#" + parts[1] : '';
  var query = (url = parts[0]).split("?", 2);
  if (query.length === 1) 
    return url + "?" + key + "=" + value + anchor;

  for (var params = query[query.length - 1].split("&"), i = 0; i < params.length; i++)
    if (params[i].toLowerCase().startsWith(key.toLowerCase() + "="))
      return params[i] = key + "=" + value, query[query.length - 1] = params.join("&"), query.join("?") + anchor;

  return url + "&" + key + "=" + value + anchor
}
1
cwills

Usando jQuery possiamo fare come sotto

var query_object = $.query_string;
query_object["KEY"] = "VALUE";
var new_url = window.location.pathname + '?'+$.param(query_object)

Nella variabile new_url avremo nuovi parametri di query.

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

0
Anjaneyulu Batta

Questo dovrebbe servire allo scopo: 

function updateQueryString(url, key, value) {
    var arr =  url.split("#");
    var url = arr[0];
    var fragmentId = arr[1];
    var updatedQS = "";
    if (url.indexOf("?") == -1) {
        updatedQS = encodeURIComponent(key) + "=" + encodeURIComponent(value);
    }
    else {
        updatedQS = addOrModifyQS(url.substring(url.indexOf("?") + 1), key, value); 
    }
    url = url.substring(0, url.indexOf("?")) + "?" + updatedQS;
    if (typeof fragmentId !== 'undefined') {
        url = url + "#" + fragmentId;
    }
    return url;
}

function addOrModifyQS(queryStrings, key, value) {
    var oldQueryStrings = queryStrings.split("&");
    var newQueryStrings = new Array();
    var isNewKey = true;
    for (var i in oldQueryStrings) {
        var currItem = oldQueryStrings[i];
        var searchKey = key + "=";
        if (currItem.indexOf(searchKey) != -1) {
            currItem = encodeURIComponent(key) + "=" + encodeURIComponent(value);
            isNewKey = false;
        }
        newQueryStrings.Push(currItem);
    }
    if (isNewKey) {
        newQueryStrings.Push(encodeURIComponent(key) + "=" + encodeURIComponent(value));
    }
    return newQueryStrings.join("&");
}   
0
mmuzahid

se vuoi impostare più parametri contemporaneamente:

function updateQueryStringParameters(uri, params) {
    for(key in params){
      var value = params[key],
          re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"),
          separator = uri.indexOf('?') !== -1 ? "&" : "?";
      if (uri.match(re)) {
        uri = uri.replace(re, '$1' + key + "=" + value + '$2');
      }
      else {
        uri = uri + separator + key + "=" + value;
      }
    }
    return uri;
}

stessa funzione di @ amatoriale

se jslint ti dà un errore aggiungi questo dopo il ciclo for

if(params.hasOwnProperty(key))
0
Rachid Oussanaa

Ci sono molte risposte scomode e inutilmente complicate in questa pagina. Il più votato, @ amateur, è abbastanza buono, sebbene abbia un po 'di inutile lanugine nel RegExp. Ecco una soluzione leggermente più ottimale con RegExp più pulito e una chiamata replace più pulita:

function updateQueryStringParamsNoHash(uri, key, value) {
  var re = new RegExp("([?&])" + key + "=[^&]*", "i");
  return re.test(uri)
       ? uri.replace(re, '$1' + key + "=" + value)
       : uri + separator + key + "=" + value
  ;
}

Come bonus aggiuntivo, se uri non è una stringa, non otterrai errori nel tentativo di chiamare match o replace su qualcosa che potrebbe non implementare tali metodi.

E se vuoi gestire il caso di un hash (e hai già fatto un controllo per l'HTML formattato correttamente), puoi sfruttare la funzione esistente invece di scrivere una nuova funzione che contiene la stessa logica:

function updateQueryStringParams(url, key, value) {
    var splitURL = url.split('#');
    var hash = splitURL[1];
    var uri = updateQueryStringParamsNoHash(splitURL[0]);
    return hash == null ? uri : uri + '#' + hash;
}

Oppure puoi apportare alcune piccole modifiche alla risposta altrimenti eccellente di @ Adam:

function updateQueryStringParameter(uri, key, value) {
  var re = new RegExp("([?&])" + key + "=[^&#]*", "i");
  if (re.test(uri)) {
    return uri.replace(re, '$1' + key + "=" + value);
  } else {
    var matchData = uri.match(/^([^#]*)(#.*)?$/);
    var separator = /\?/.test(uri) ? "&" : "?";    
    return matchData[0] + separator + key + "=" + value + (matchData[1] || '');
  }
}
0
elreimundo

Per dare un esempio di codice per modificare window.location.search come suggerito da Gal e tradyblix:

var qs = window.location.search || "?";
var param = key + "=" + value; // remember to URI encode your parameters
if (qs.length > 1) {
    // more than just the question mark, so append with ampersand
    qs = qs + "&";
}
qs = qs + param;
window.location.search = qs;
0
Risadinha

Ecco un metodo alternativo che utilizza le proprietà integrate dell'elemento HTML di ancoraggio:

  • Gestisce i parametri multivalore.
  • Nessun rischio di modificare il # frammento o qualcosa di diverso dalla stringa di query stessa.
  • Potrebbe essere un po 'più facile da leggere? Ma è più lungo.

    var a = document.createElement('a'),

	getHrefWithUpdatedQueryString = function(param, value) {
	    return updatedQueryString(window.location.href, param, value);
	},

	updatedQueryString = function(url, param, value) {
	    /*
	     A function which modifies the query string 
             by setting one parameter to a single value.

	     Any other instances of parameter will be removed/replaced.
	     */
	    var fragment = encodeURIComponent(param) + 
                           '=' + encodeURIComponent(value);

	    a.href = url;

	    if (a.search.length === 0) {
		a.search = '?' + fragment;
	    } else {
		var didReplace = false,
		    // Remove leading '?'
		    parts = a.search.substring(1)
		// Break into pieces
			.split('&'),

		    reassemble = [],
		    len = parts.length;

		for (var i = 0; i < len; i++) {
		    
		    var pieces = parts[i].split('=');
		    if (pieces[0] === param) {
			if (!didReplace) {
			    reassemble.Push('&' + fragment);
			    didReplace = true;
			}
		    } else {
			reassemble.Push(parts[i]);
		    }
		}

		if (!didReplace) {
		    reassemble.Push('&' + fragment);
		}

		a.search = reassemble.join('&');
	    }

	    return a.href;
	};

0
GlennS

Codice di script Java per trovare una stringa di query specifica e sostituirne il valore *

('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;
                }
            })
        });
0
Mohamed.Abdo

Sì, ho avuto un problema in cui il mio querystring sarebbe traboccare e duplicare, ma questo era dovuto alla mia lentezza. così ho giocato un po 'e lavorato su js jquery (sfrigolante) e C # magick.

Quindi mi sono appena reso conto che dopo che il server ha eseguito i valori passati, i valori non hanno più importanza, non c'è riutilizzo, se il client voleva fare la stessa cosa evidentemente sarà sempre una nuova richiesta, anche se è il stessi parametri passati. E questo è tutto clientide, quindi alcuni caching/cookies ecc potrebbero essere fantastici in merito.

JS:

$(document).ready(function () {
            $('#ser').click(function () {
                SerializeIT();
            });
            function SerializeIT() {
                var baseUrl = "";
                baseUrl = getBaseUrlFromBrowserUrl(window.location.toString());
                var myQueryString = "";
                funkyMethodChangingStuff(); //whatever else before serializing and creating the querystring
                myQueryString = $('#fr2').serialize();
                window.location.replace(baseUrl + "?" + myQueryString);
            }
            function getBaseUrlFromBrowserUrl(szurl) {
                return szurl.split("?")[0];
            } 
            function funkyMethodChangingStuff(){
               //do stuff to whatever is in fr2
            }
        });

HTML:

<div id="fr2">
   <input type="text" name="qURL" value="http://somewhere.com" />
   <input type="text" name="qSPart" value="someSearchPattern" />
</div>
<button id="ser">Serialize! and go play with the server.</button>

C #:

    using System.Web;
    using System.Text;
    using System.Collections.Specialized;

    public partial class SomeCoolWebApp : System.Web.UI.Page
    {
        string weburl = string.Empty;
        string partName = string.Empty;

        protected void Page_Load(object sender, EventArgs e)
        {
            string loadurl = HttpContext.Current.Request.RawUrl;
            string querySZ = null;
            int isQuery = loadurl.IndexOf('?');
            if (isQuery == -1) { 
                //If There Was no Query
            }
            else if (isQuery >= 1) {
                querySZ = (isQuery < loadurl.Length - 1) ? loadurl.Substring(isQuery + 1) : string.Empty;
                string[] getSingleQuery = querySZ.Split('?');
                querySZ = getSingleQuery[0];

                NameValueCollection qs = null;
                qs = HttpUtility.ParseQueryString(querySZ);

                weburl = qs["qURL"];
                partName = qs["qSPart"];
                //call some great method thisPageRocks(weburl,partName); or whatever.
          }
      }
  }

Ok, le critiche sono ben accette (questo è stato un intruglio notturno, quindi sentitevi liberi di prendere nota delle regolazioni). Se questo ti è stato di aiuto, fallo un pollice, Happy Coding.

Nessun duplicato, ogni richiesta è unica come è stata modificata e, a causa di come è strutturata, è facile aggiungere più query dinamicamente dall'interno del dominio.

0
LokizFenrir