Wie kann ich mit Javascript der URL einen Abfragezeichenfolgenparameter hinzufügen, wenn dieser nicht vorhanden ist oder wenn er vorhanden ist, den aktuellen Wert aktualisieren? Ich verwende jquery für meine clientseitige Entwicklung.
javascript
jquery
query-string
Amateur
quelle
quelle
String#split
nimmt einen zweiten Parameter für maximale Teilungen. jQuery'smap
wird ebenfalls hilfreich sein.Antworten:
Ich habe die folgende Funktion geschrieben, die das erreicht, was ich erreichen möchte:
quelle
[?|&]
sollte sein[?&]
var
unmittelbar vor der Trennzeichendeklaration hinzufügen .value = encodeURIComponent(value);
in der ersten Zeile hinzufügen , sonst werden Zeilenumbrüche nicht richtig maskiert.Ich habe die Lösung erweitert und mit einer anderen kombiniert, bei der ich festgestellt habe, dass sie die Querystring-Parameter basierend auf den Benutzereingaben und unter Berücksichtigung des URL-Ankers ersetzt / aktualisiert / entfernt.
Wenn Sie keinen Wert angeben, wird der Parameter entfernt. Wenn Sie einen Wert angeben, wird der Parameter hinzugefügt / aktualisiert. Wenn keine URL angegeben wird, wird diese aus window.location abgerufen
Aktualisieren
Beim Entfernen des ersten Parameters im Querystring ist ein Fehler aufgetreten. Ich habe den regulären Ausdruck überarbeitet und getestet, um einen Fix einzuschließen.
Zweites Update
Wie von @ JarónBarends vorgeschlagen - Überprüfen Sie die Wertprüfung, um sie gegen undefiniert und null zu prüfen, damit 0-Werte festgelegt werden können
Drittes Update
Es gab einen Fehler, bei dem das Entfernen einer Querystring-Variablen direkt vor einem Hashtag das Hashtag-Symbol verlor, das behoben wurde
Viertes Update
Vielen Dank an @rooby für den Hinweis auf eine Regex-Optimierung im ersten RegExp-Objekt. Setzen Sie den anfänglichen regulären Ausdruck auf ([? &]), Da bei der Verwendung von (\? | &) Von @YonatanKarni ein Problem aufgetreten ist
Fünftes Update
Das Deklarieren von Hash var in der if / else-Anweisung wird entfernt
quelle
value
verursachen diese Variablen aus dem Abfragezeichenfolgeflag zu entfernen , wenn Sie den Wert auf 0 gesetzt , so stattif (value) {}
Sie verwenden solltenif (typeOf value !== 'undefined' && value !== null) {}
hash
wird zweimal deklariert;)Das Dienstprogramm URLSearchParams kann hierfür in Kombination mit hilfreich sein
window.location.search
. Zum Beispiel:Jetzt
foo
wurde festgelegt,bar
unabhängig davon, ob es bereits vorhanden war oder nicht.Die obige Zuweisung zu
window.location.search
verursacht jedoch ein Laden der Seite. Wenn dies nicht wünschenswert ist, verwenden Sie die Verlaufs-API wie folgt:Jetzt müssen Sie keinen eigenen regulären Ausdruck oder keine eigene Logik schreiben, um das mögliche Vorhandensein von Abfragezeichenfolgen zu behandeln.
Die Browserunterstützung ist jedoch schlecht, da sie derzeit experimentell ist und nur in neueren Versionen von Chrome, Firefox, Safari, iOS Safari, Android Browser, Android Chrome und Opera verwendet wird. Verwenden Sie es mit einer Polyfüllung, wenn Sie sie verwenden möchten.
Update: Die Browserunterstützung hat sich seit meiner ursprünglichen Antwort verbessert.
quelle
Unable to set property '__URLSearchParams__:0.8503766759030615' of undefined or null reference
auf ie11 bekommst du diesen fehler. Es ist keine Pollyfill, wenn es nicht als Fallback funktioniert.newRelativePathQuery
macht den Trick:var newRelativePathQuery = window.location.pathname + '?' + searchParams.toString() + window.location.hash;
Basierend auf der Antwort von @ amateur (und jetzt mit dem Fix aus dem Kommentar von @j_walker_dev), aber unter Berücksichtigung des Kommentars zu Hash-Tags in der URL verwende ich Folgendes:
Bearbeitet, um
[?|&]
in Regex zu korrigieren, was natürlich[?&]
wie in den Kommentaren angegeben sein sollteBearbeiten: Alternative Version, um auch das Entfernen von URL-Parametern zu unterstützen. Ich habe
value === undefined
als Weg verwendet, um die Entfernung anzuzeigen. Könntevalue === false
wie gewünscht oder sogar einen separaten Eingabeparameter verwenden.Sehen Sie es in Aktion unter https://jsfiddle.net/bp3tmuxh/1/
quelle
var separator
Zeile nach rechts über der Rückgabe verschieben, wird ein Fehler mit "/ app # / cool? Fun = true" behoben. Dies würde ein "&" als Trennzeichen wählen, obwohl es noch keine echten Abfragezeichenfolgenparameter gibt. Nur Kunden.[?|&]
sollte gerecht sein[?&]
(sonst wird übereinstimmen|
)."([?|&])"
ist nicht gut. Bitte beheben Sie dies entwedervar re = new RegExp("(?|&)" + key + "=.*?(&|#|$)", "i");
odervar re = new RegExp("([?&])" + key + "=.*?(&|#|$)", "i");
(eine nette Erweiterung auf andere Weise!)var re = new RegExp("(?|&)" + key + "=.*?(&|#|$)", "i");
funktioniert nicht, der zweite funktioniertHier ist meine Bibliothek, um das zu tun: https://github.com/Mikhus/jsurl
quelle
Mir ist klar, dass diese Frage alt ist und zu Tode beantwortet wurde, aber hier ist mein Stich. Ich versuche hier das Rad neu zu erfinden, weil ich die aktuell akzeptierte Antwort verwendet habe und der falsche Umgang mit URL-Fragmenten mich kürzlich in einem Projekt gebissen hat.
Die Funktion ist unten. Es ist ziemlich lang, aber es wurde so belastbar wie möglich gemacht. Ich würde gerne Vorschläge zur Verkürzung / Verbesserung machen. Ich habe eine kleine jsFiddle-Testsuite dafür (oder andere ähnliche Funktionen) zusammengestellt. Wenn eine Funktion dort jeden der Tests bestehen kann, ist es wahrscheinlich gut zu gehen.
Update: Ich bin auf eine coole Funktion für die Verwendung des DOM zum Parsen von URLs gestoßen , daher habe ich diese Technik hier integriert. Dies macht die Funktion kürzer und zuverlässiger. Requisiten an den Autor dieser Funktion.
quelle
window.location.search ist Lesen / Schreiben.
Wenn Sie jedoch die Abfragezeichenfolge ändern, wird die Seite, auf der Sie sich befinden, umgeleitet und vom Server aktualisiert.
Wenn Sie versuchen, den clientseitigen Status beizubehalten (und möglicherweise als Lesezeichen zu verwenden), möchten Sie den URL-Hash anstelle der Abfragezeichenfolge ändern, wodurch Sie auf derselben Seite (window.location) bleiben. Hash ist Lesen / Schreiben). So machen es Websites wie twitter.com.
Sie möchten auch, dass die Schaltfläche "Zurück" funktioniert. Sie müssen Javascript-Ereignisse an das Hash-Änderungsereignis binden, ein gutes Plugin dafür http://benalman.com/projects/jquery-hashchange-plugin/.
quelle
Wenn es nicht festgelegt ist oder mit einem neuen Wert aktualisiert werden soll, können Sie Folgendes verwenden:
Dies ist übrigens in einfachem Javascript.
BEARBEITEN
Möglicherweise möchten Sie versuchen, das jquery- Abfrageobjekt- Plugin zu verwenden
quelle
Hier ist mein Ansatz: Die
location.params()
Funktion (siehe unten) kann als Getter oder Setter verwendet werden. Beispiele:Angesichts der URL ist
http://example.com/?foo=bar&baz#some-hash
,location.params()
gibt ein Objekt mit allen Abfrageparametern zurück :{foo: 'bar', baz: true}
.location.params('foo')
wird zurückkehren'bar'
.location.params({foo: undefined, hello: 'world', test: true})
ändert die URL inhttp://example.com/?baz&hello=world&test#some-hash
.Hier ist die
params()
Funktion, die optional demwindow.location
Objekt zugewiesen werden kann.quelle
Dies ist meine Präferenz und deckt die Fälle ab, an die ich denken kann. Kann sich jemand eine Möglichkeit vorstellen, es auf einen einzigen Ersatz zu reduzieren?
quelle
Ich weiß, dass dies ziemlich alt ist, aber ich möchte meine Arbeitsversion hier abfeuern.
HINWEIS Dies ist eine modifizierte Version von @elreimundo
quelle
Meine Einstellung von hier (kompatibel mit "use strict"; verwendet jQuery nicht wirklich):
Anwendungsbeispiel:
quelle
Basierend auf der Antwort von @ellemayo habe ich die folgende Lösung gefunden, mit der das Hash-Tag auf Wunsch deaktiviert werden kann:
Nennen Sie es so:
Ergebnisse in:
quelle
typeof value !== 'undefined' && value !== null
expliziter,value != null
bedeutet aber dasselbe und ist prägnanter.Hier ist eine kürzere Version, die sich darum kümmert
Code:
Die Regex- Beschreibung finden Sie hier .
HINWEIS : Diese Lösung basiert auf der Antwort von @amateur, enthält jedoch viele Verbesserungen.
quelle
Code, der eine Liste von Parametern mit ES6 und jQuery an eine vorhandene URL anfügt:
Wo listOfParams ist
Anwendungsbeispiel:
Schnelle Tests:
quelle
Ein anderer Ansatz ohne reguläre Ausdrücke . Unterstützt 'Hash'-Anker am Ende der URL sowie mehrere Fragezeichen (?). Sollte etwas schneller sein als der Ansatz mit regulären Ausdrücken.
quelle
Verwenden Sie diese Funktion, um Abfragezeichenfolgenparameter basierend auf jquery zur URL hinzuzufügen, zu entfernen und zu ändern
Fügen Sie neue hinzu und ändern Sie vorhandene Parameter zur URL
Vorhandene entfernen
quelle
Mit verwenden
jQuery
können wir wie unten tunIn Variable
new_url
wir neue Abfrageparameter.Referenz: http://api.jquery.com/jquery.param/
quelle
So geben Sie ein Codebeispiel für Änderungen an,
window.location.search
wie von Gal und tradyblix vorgeschlagen:quelle
Java-Skriptcode, um eine bestimmte Abfragezeichenfolge zu finden und ihren Wert zu ersetzen *
quelle
Ja, ich hatte ein Problem, bei dem mein Querystring überlief und sich duplizierte, aber das lag an meiner eigenen Trägheit. Also habe ich ein bisschen gespielt und ein bisschen js jquery (eigentlich brutzelnd) und C # magick aufgearbeitet.
Also habe ich gerade festgestellt, dass, nachdem der Server mit den übergebenen Werten fertig ist, die Werte keine Rolle mehr spielen, es keine Wiederverwendung mehr gibt. Wenn der Client das Gleiche offensichtlich tun wollte, wird es immer eine neue Anfrage sein, auch wenn es die ist gleiche Parameter werden übergeben. Und das ist alles clientseitig, so dass einige Caching / Cookies usw. in dieser Hinsicht cool sein könnten.
JS:
HTML:
C #:
Keine Duplikate, jede Anforderung ist so eindeutig, wie Sie sie geändert haben, und aufgrund ihrer Struktur können Sie einfach mehr dynamische Abfragen innerhalb des Dom hinzufügen.
quelle
Hier ist eine alternative Methode, die die integrierten Eigenschaften des Anker-HTML-Elements verwendet:
quelle
Wenn Sie mehrere Parameter gleichzeitig einstellen möchten:
gleiche Funktion wie bei @ amateur
Wenn jslint einen Fehler anzeigt, fügen Sie diesen nach der for-Schleife hinzu
quelle
http://abc.def/?a&b&c
).Auf dieser Seite gibt es viele umständliche und unnötig komplizierte Antworten. Das am besten bewertete, @ amateur's, ist ziemlich gut, obwohl es im RegExp ein bisschen unnötigen Flaum enthält. Hier ist eine etwas optimalere Lösung mit Cleaner RegExp und einem Cleaner
replace
Call:Als zusätzlichen Bonus erhalten Sie, wenn
uri
es sich nicht um eine Zeichenfolge handelt, keine Fehler , wenn Sie versuchen, etwas aufzurufenmatch
oderreplace
etwas aufzurufen , das diese Methoden möglicherweise nicht implementiert.Wenn Sie den Fall eines Hashs behandeln möchten (und bereits eine Überprüfung auf ordnungsgemäß formatiertes HTML durchgeführt haben), können Sie die vorhandene Funktion nutzen, anstatt eine neue Funktion zu schreiben, die dieselbe Logik enthält:
Oder Sie können einige geringfügige Änderungen an der ansonsten hervorragenden Antwort von @ Adam vornehmen:
quelle
separator
ist nicht definiert inupdateQueryStringParamsNoHash
. InupdateQueryStringParameter
bricht alles zusammen, wenn dem Parameter, den Sie ersetzen, kein Wert zugewiesen wurde (zhttp://abc.def/?a&b&c
. B. ).Dies sollte dem Zweck dienen:
quelle