Gibt es eine Plugin-freie Möglichkeit, Abfragezeichenfolgenwerte über jQuery (oder ohne) abzurufen ?
Wenn das so ist, wie? Wenn nicht, gibt es ein Plugin, das dies kann?
javascript
url
plugins
query-string
Ripounet
quelle
quelle
Antworten:
Update: Sep-2018
Sie können URLSearchParams verwenden, das einfach ist und eine anständige (aber nicht vollständige) Browserunterstützung bietet .
Original
Zu diesem Zweck benötigen Sie jQuery nicht. Sie können nur reines JavaScript verwenden:
Verwendungszweck:
Hinweis: Wenn ein Parameter mehrmals vorhanden ist (
?foo=lorem&foo=ipsum
), erhalten Sie den ersten Wert (lorem
). Es gibt keinen Standard dafür und die Verwendung variiert, siehe zum Beispiel diese Frage: Autorisierende Position doppelter HTTP-GET-Abfrageschlüssel .HINWEIS: Bei der Funktion wird zwischen Groß- und Kleinschreibung unterschieden. Wenn Sie den Parameternamen ohne Berücksichtigung der Groß- und Kleinschreibung bevorzugen, fügen Sie RegExp den Modifikator 'i' hinzu
Dies ist ein Update, das auf den neuen URLSearchParams-Spezifikationen basiert , um das gleiche Ergebnis prägnanter zu erzielen. Siehe Antwort mit dem Titel " URLSearchParams " unten.
quelle
http://www.mysite.com/index.php?x=x1&x=x2&x=x3
Der Wert des Feldesx
ist nicht eindeutig.?mykey=0&m.+key=1
Aufruf stattgetParameterByName("m.+key")
zurückkehren . Sie müssen den Metazeichen für reguläre Ausdrücke entkommen, bevor Sie Ihren regulären Ausdruck erstellen können . Und Sie müssen nur einmal aufrufen, indem Sie das globale Flag verwenden und als Ersatzausdruck verwenden. Sie sollten suchen auf der Stelle . Eine Antwort mit über 400 Upvotes sollte diese Details berücksichtigen.0
1
name
.replace()
"\\$&"
location.search
location.href
Einige der hier veröffentlichten Lösungen sind ineffizient. Das Wiederholen der Suche nach regulären Ausdrücken jedes Mal, wenn das Skript auf einen Parameter zugreifen muss, ist völlig unnötig. Eine einzige Funktion zum Aufteilen der Parameter in ein Objekt im assoziativen Array-Stil reicht aus. Wenn Sie nicht mit der HTML 5-Verlaufs-API arbeiten, ist dies nur einmal pro Seitenladevorgang erforderlich. Die anderen Vorschläge hier können die URL ebenfalls nicht korrekt dekodieren.
Beispiel für eine Abfrage:
Ergebnis:
Dies könnte leicht verbessert werden, um auch Abfragezeichenfolgen im Array-Stil zu verarbeiten. Ein Beispiel hierfür ist hier , aber da in RFC 3986 keine Parameter im Array-Stil definiert sind, werde ich diese Antwort nicht mit dem Quellcode verschmutzen. Für diejenigen, die an einer "verschmutzten" Version interessiert sind, schauen Sie sich die Antwort von campbeln unten an .
Wie in den Kommentaren ausgeführt,
;
ist dies auch ein rechtlicher Begrenzer fürkey=value
Paare. Es würde eine kompliziertere Regex erfordern, um damit umzugehen,;
oder&
was ich für unnötig halte, da es selten;
verwendet wird und ich würde noch unwahrscheinlicher sagen, dass beide verwendet werden würden. Wenn Sie;
stattdessen Unterstützung benötigen&
, tauschen Sie sie einfach im regulären Ausdruck aus.Wenn Sie eine serverseitige Vorverarbeitungssprache verwenden, möchten Sie möglicherweise die nativen JSON-Funktionen verwenden, um das schwere Heben für Sie zu erledigen. In PHP können Sie beispielsweise schreiben:
Viel einfacher!
AKTUALISIERT
Dies ist also der Ansatz, um es zu verwalten:
quelle
window.location.hash
Eigenschaft, die von derwindow.location.search
Eigenschaft getrennt ist. Wenn sich der Hash ändert, hat dies keinerlei Auswirkungen auf den Querystring.;
ein gesetzlicher Begrenzer für GET-key=value
Paare ist. Es ist selten, aber die Implementierung dauert 5 Sekunden.?a=b&c=d
ist konventionell und eine W3C-Empfehlung für Webformulare, aber die URI-Spezifikation definiert nurquery = *( pchar / "/" / "?" )
.while(match = search.exec(query))
mitwhile((match = search.exec(query)) !== null)
ES2015 (ES6)
Ohne jQuery
Bei einer URL wie
?topic=123&name=query+string
folgt wird Folgendes zurückgegeben:Google-Methode
Beim Zerreißen von Googles Code habe ich die Methode gefunden, die sie verwenden:
getUrlParameters
Es ist verschleiert, aber es ist verständlich. Es funktioniert nicht, da einige Variablen undefiniert sind.
Sie beginnen, nach Parametern in der URL von
?
und auch aus dem Hash zu suchen#
. Dann teilen sie sich für jeden Parameter das Gleichheitszeichenb[f][p]("=")
(wie es aussiehtindexOf
, verwenden sie die Position des Zeichens , um den Schlüssel / Wert zu erhalten). Nach der Aufteilung prüfen sie, ob der Parameter einen Wert hat oder nicht. Wenn dies der Fall ist, speichern sie den Wert vond
, andernfalls fahren sie einfach fort.Am Ende wird das Objekt
d
zurückgegeben, wobei die Flucht und das+
Zeichen behandelt werden. Dieses Objekt ist genau wie meins, es hat das gleiche Verhalten.Meine Methode als jQuery-Plugin
Verwendungszweck
Leistungstest (Split-Methode gegen Regex-Methode) ( jsPerf )
Vorbereitungscode: Methodendeklaration
Testcode teilen
Regex-Testcode
Testen in Firefox 4.0 x86 unter Windows Server 2008 R2 / 7 x64
quelle
unescape
ist eine veraltete Funktion und wird durch ersetztdecodeURIComponent()
. Beachten Sie, dass keine dieser Funktionen a korrekt+
in ein Leerzeichen dekodiert . 2. Sie sollten das Ergebnis als Objekt und nicht als Array deklarieren, da JavaScript per se keine assoziativen Arrays enthält und das von Ihnen deklarierte Array als Objekt behandelt wird, indem Sie ihm trotzdem benannte Eigenschaften zuweisen.window.location
führt jedoch zu Leistungsproblemen, da der Client, der zur URL navigiert, weitaus teurer ist.Verbesserte Version der Antwort von Artem Barger :
Weitere Informationen zur Verbesserung finden Sie unter: http://james.padolsey.com/javascript/bujs-1-getparameterbyname/
quelle
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
.null
wenn dem Parameter nicht '=' folgt. Sie können vorab festlegenif (!RegExp('[?&]'+name+'(&.*)?$').exec(window.location.search)) return false;
, dass es zurückgegeben wird,boolean false
wenn der Parameter überhaupt nicht vorhanden ist.new
Präfix beim Erstellen der Regex verwenden:var match = new RegExp('...
.replace('\u200E', '')
var results = new RegExp('[\\?&]' + name + '=([^&#/]*)').exec(url);
URLSearchParams
Firefox 44+, Opera 36+, Edge 17+, Safari 10.3+ und Chrome 49+ unterstützen die URLSearchParams- API:
Für die stabilen Versionen von IE gibt es eine von Google vorgeschlagene URLSearchParams - Polyfüllung .
Es ist nicht von W3C standardisiert , aber es ist ein Lebensstandard von WhatWG .
Sie können es verwenden auf
location
:oder
Oder natürlich auf einer beliebigen URL:
Sie können Parameter auch mithilfe einer Kurzschrift-
.searchParams
Eigenschaft für das URL-Objekt abrufen :Sie lesen / eingestellten Parameter durch die
get(KEY)
,set(KEY, VALUE)
,append(KEY, VALUE)
API. Sie können auch alle Werte durchlaufenfor (let p of params) {}
.Eine Referenzimplementierung und eine Beispielseite stehen zum Prüfen und Testen zur Verfügung.
quelle
.get
statt nur.
slice(1)
auf.search
, können Sie es direkt nutzen können. URLSearchParams kann die führenden verarbeiten?
.URLSearchParams
ist nicht gut, weil es nicht die tatsächlichen Werte der Parameter einer URL zurückgibt.new URL('https://example.com?foo=1&bar=2')
funktioniert nicht für Android URLfile:///android_asset/...
Nur eine weitere Empfehlung. Das Plugin Purl ermöglicht das Abrufen aller Teile der URL, einschließlich Anker, Host usw.
Es kann mit oder ohne jQuery verwendet werden.
Die Bedienung ist sehr einfach und cool:
Ab dem 11. November 2014 wird Purl jedoch nicht mehr beibehalten, und der Autor empfiehlt, stattdessen URI.js zu verwenden. Das jQuery-Plugin unterscheidet sich darin, dass es sich auf Elemente konzentriert - zur Verwendung mit Zeichenfolgen einfach
URI
direkt, mit oder ohne jQuery. Ähnlicher Code würde als solcher aussehen, umfassendere Dokumente hier :quelle
tl; dr
Eine schnelle, vollständige Lösung , die mehrwertige Schlüssel und codierte Zeichen verarbeitet .
Mehrzeilig:Was ist all dieser Code ...
Beispiel:"Null-Koaleszenz" , Kurzschlussauswertung
ES6 Destrukturierungszuweisungen , Pfeilfunktionen , Vorlagenzeichenfolgen
Lesen Sie mehr ... über die Vanilla JavaScript-Lösung.
Um auf verschiedene Teile einer URL zuzugreifen, verwenden Sie
location.(search|hash)
Einfachste (Dummy-) Lösung
Mehrwertige Schlüssel
Einfache Schlüsselüberprüfung
(item in dict) ? dict.item.push(val) : dict.item = [val]
qd.key[index]
oderqd[key][index]
Codierte Zeichen?
Verwenden Sie
Beispiel:decodeURIComponent()
für die zweite oder beide Teilungen.Aus Kommentaren
* !!! Bitte beachten Sie, dass dies eine
decodeURIComponent(undefined)
Zeichenfolge zurückgibt"undefined"
. Die Lösung liegt in einer einfachen Verwendung von&&
, die sicherstellt, dassdecodeURIComponent()
keine undefinierten Werte aufgerufen werden. (Siehe die "Komplettlösung" oben.)Wenn der Querystring leer ist (
location.search == ""
), ist das Ergebnis etwas irreführendqd == {"": undefined}
. Es wird empfohlen, den Querystring zu überprüfen, bevor Sie die Parsing-Funktion wie folgt starten:quelle
array.forEach()
indem Sie bestimmten Code am Anfang Ihres Skripts einfügen. Siehe Polyfill developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…var qd = {}; location.search.substr(1).split("&").forEach( function(item) { var s = item.split("="), k = s[0], v; if(s.length>1) v = decodeURIComponent(s[1]); (k in qd) ? qd[k].push(v) : qd[k] = [v] })
Roshambo auf snipplr.com verfügt über ein einfaches Skript, um dies zu erreichen. Dies wird unter Abrufen von URL-Parametern mit jQuery | beschrieben Verbessert . Mit seinem Skript können Sie auch ganz einfach nur die gewünschten Parameter herausholen.
Hier ist das Wesentliche:
Dann holen Sie sich einfach Ihre Parameter aus der Abfragezeichenfolge.
Also, wenn die URL / Abfragezeichenfolge war
xyz.com/index.html?lang=de
.Rufen
var langval = $.urlParam('lang');
Sie einfach an und Sie haben es.UZBEKJON hat auch einen großartigen Blog-Beitrag dazu: URL-Parameter und -Werte mit jQuery abrufen .
quelle
0
? Sicher, ich könnte eine strenge Gleichstellungsprüfung verwenden, aber sollte es nicht seinnull
?Wenn Sie jQuery verwenden, können Sie eine Bibliothek verwenden, z. B. jQuery BBQ: Back Button & Query Library .
Bearbeiten: Hinzufügen von Deparam Beispiel:
Wenn Sie nur einfaches JavaScript verwenden möchten, können Sie ...
Aufgrund der neuen HTML-Verlaufs-API und speziell
history.pushState()
undhistory.replaceState()
kann sich die URL ändern, wodurch der Cache der Parameter und ihrer Werte ungültig wird.Diese Version aktualisiert den internen Parameter-Cache jedes Mal, wenn sich der Verlauf ändert.
quelle
Verwenden Sie einfach zwei Splits :
Ich habe alle vorherigen und vollständigeren Antworten gelesen. Aber ich denke, das ist die einfachste und schnellste Methode. Sie können diesen jsPerf- Benchmark einchecken
Um das Problem in Rups Kommentar zu lösen, fügen Sie eine bedingte Aufteilung hinzu, indem Sie die erste Zeile in die beiden folgenden ändern. Absolute Genauigkeit bedeutet jedoch, dass es jetzt langsamer als regulärer Ausdruck ist (siehe jsPerf ).
Wenn Sie also wissen, dass Sie nicht auf Rups Gegenfall stoßen, gewinnt dies. Andernfalls regexp.
quelle
get('value')
aufhttp://the-url?oldvalue=1&value=2
.half
ob dies wahr ist, wird für einen leeren Parameter wie null null zurückgegeben?param=
. In diesem Fall sollte die leere Zeichenfolge zurückgegeben werden, und die Überprüfunghalf !== undefined
löst dies.function get(param){return decodeURIComponent((location.search.split(param+'=')[1]||'').split('&')[0])}
return half !== undefined ? decodeURIComponent(half[1].split('&')[0]) : null;
, um sie zumHier ist mein Versuch, Andy E's exzellente Lösung in ein vollwertiges jQuery-Plugin zu verwandeln:
Die Syntax lautet:
Beste aus beiden Welten!
quelle
Wenn Sie mehr URL - Manipulation tun , als nur die Abfragezeichenfolgeflag Parsen, können Sie feststellen URI.js hilfreich. Es ist eine Bibliothek zum Bearbeiten von URLs - und wird mit allen Schnickschnack geliefert. (Entschuldigung für die Eigenwerbung hier)
So konvertieren Sie Ihren Querystring in eine Karte:
(URI.js auch „fixe“ schlecht querystrings gerne
?&foo&&bar=baz&
an?foo&bar=baz
)quelle
var data = URI.parseQuery('?foo=bar&bar=baz&foo=world');
gleiche Ergebnis erzielen ( Dokumente ).Ich mag die Lösung von Ryan Phelan . Aber ich sehe keinen Grund, jQuery dafür zu erweitern? Die jQuery-Funktionalität wird nicht verwendet.
Andererseits gefällt mir die in Google Chrome integrierte Funktion: window.location.getParameter.
Warum also nicht nutzen? Okay, andere Browser haben nicht. Erstellen wir also diese Funktion, wenn sie nicht vorhanden ist:
Diese Funktion stammt mehr oder weniger von Ryan Phelan, ist jedoch anders verpackt: klarer Name und keine Abhängigkeiten von anderen Javascript-Bibliotheken. Mehr zu dieser Funktion in meinem Blog .
quelle
Hier ist ein schneller Weg, um ein Objekt zu erhalten, das dem PHP $ _GET- Array ähnelt :
Verwendungszweck:
Für die Abfragezeichenfolge wird
x=5&y&z=hello&x=6
das Objekt zurückgegeben:quelle
(function($) { $.extend({ get_query: function (name) { var url = location.href; var qs = url.substring(url.indexOf('?') + 1).split('&'); for(var i = 0, result = {}; i < qs.length; i++){ qs[i] = qs[i].split('='); result[qs[i][0]] = qs[i][1]; } return result; } }); })(jQuery);
und verwenden Sie es wie folgt :$.get_query()
location.href
müsste durch ersetzt werdenlocation.search
.Halten Sie es einfach in einfachem JavaScript-Code:
Rufen Sie es von überall im JavaScript-Code auf:
quelle
window.location.search
!Dies sind alles großartige Antworten, aber ich brauchte etwas Robusteres und dachte, Sie alle möchten vielleicht das haben, was ich erstellt habe.
Es ist eine einfache Bibliotheksmethode, die URL-Parameter zerlegt und bearbeitet. Die statische Methode verfügt über die folgenden Untermethoden, die unter der Betreff-URL aufgerufen werden können:
Beispiel:
quelle
Aus dem MDN :
quelle
Code Golf:
Zeigen Sie es an!
Auf meinem Mac: wird
test.htm?i=can&has=cheezburger
angezeigtquelle
Ich benutze häufig reguläre Ausdrücke, aber nicht dafür.
Es erscheint mir einfacher und effizienter, die Abfragezeichenfolge einmal in meiner Anwendung zu lesen und ein Objekt aus allen Schlüssel / Wert-Paaren zu erstellen, wie z.
Für eine URL wie
http://domain.com?param1=val1¶m2=val2
können Sie ihren Wert später in Ihrem Code alssearch.param1
und erhaltensearch.param2
.quelle
quelle
Die Roshambo jQuery-Methode kümmerte sich nicht um die Dekodierungs-URL
Diese Funktion wurde gerade hinzugefügt, während die return-Anweisung hinzugefügt wurde
Jetzt finden Sie das aktualisierte Wesentliche:
quelle
Ich mag dieses (entnommen aus jquery-howto.blogspot.co.uk):
Funktioniert gut für mich.
quelle
Hier ist meine Bearbeitung dieser hervorragenden Antwort - mit der zusätzlichen Möglichkeit, Abfragezeichenfolgen mit Schlüsseln ohne Werte zu analysieren.
WICHTIG! Der Parameter für diese Funktion in der letzten Zeile ist unterschiedlich. Es ist nur ein Beispiel dafür, wie man eine beliebige URL an sie übergeben kann. Sie können die letzte Zeile aus Brunos Antwort verwenden, um die aktuelle URL zu analysieren.
Was genau hat sich also geändert? Mit URL werden die
http://sb.com/reg/step1?param=
Ergebnisse gleich sein. Aber mit URL gibthttp://sb.com/reg/step1?param
Brunos Lösung ein Objekt ohne Schlüssel zurück, während meine ein Objekt mit Schlüsselparam
undundefined
Wert zurückgibt .quelle
Ich brauchte ein Objekt aus der Abfragezeichenfolge und ich hasse viel Code. Es ist vielleicht nicht das robusteste im Universum, aber es sind nur ein paar Codezeilen.
Eine URL wie
this.htm?hello=world&foo=bar
wird erstellt:quelle
decodeURIComponent
der Wert beim Speichern - und wohl auch der Schlüssel, aber es ist weniger wahrscheinlich, dass Sie dabei ungerade Zeichenfolgen verwenden.?a&b&c
dies wirklich sehr gut lesbar (und im Übrigen meiner ersten Idee ähnlich). Auch dassplit
ist überflüssig, aber ich habe größere Leistungsfische zum Braten als das zweimalige Teilen einer 10-Zeichen-Zeichenfolge.location.search.substr(1)
stattdessen verwendenlocation.href.split('?')[1]
, um zu vermeiden, dass hash (#anchor
) zusammen mit dem letzten Abfrageparameter abgerufen wird.location.search
!Hier ist eine erweiterte Version von Andy E's verknüpfter "Handle Array-Style Query Strings" -Version. Es wurde ein Fehler behoben (
?key=1&key[]=2&key[]=3
;1
geht verloren und wird durch ersetzt[2,3]
), einige kleinere Leistungsverbesserungen vorgenommen (Neukodierung von Werten, Neuberechnung der Position "[" usw.)) und eine Reihe von Verbesserungen hinzugefügt (funktionalisiert, Unterstützung für?key=1&key=2
, Unterstützung für;
Trennzeichen). . Ich habe die Variablen ärgerlich kurz gelassen, aber unzählige Kommentare hinzugefügt, um sie lesbar zu machen (oh, und ich habe siev
innerhalb der lokalen Funktionen wiederverwendet , sorry, wenn das verwirrend ist;).Es wird die folgende Abfrage verarbeiten ...
... es zu einem Objekt machen, das aussieht wie ...
Wie Sie oben sehen können, behandelt diese Version ein gewisses Maß an "fehlerhaften" Arrays, dh -
person=neek&person[]=jeff&person[]=jim
oderperson=neek&person=jeff&person=jim
da der Schlüssel identifizierbar und gültig ist (zumindest in dotNets NameValueCollection.Add ):Es scheint, dass die Jury bei wiederholten Schlüsseln etwas unzufrieden ist, da es keine Spezifikation gibt. In diesem Fall werden mehrere Schlüssel als (gefälschtes) Array gespeichert. Beachten Sie jedoch, dass ich keine auf Kommas basierenden Werte in Arrays verarbeite.
Der Code:
quelle
q = decodeURIComponent(window.location.search.substring(1)),
hilft auch dabei.Dies ist eine Funktion, die ich vor einiger Zeit erstellt habe und mit der ich sehr zufrieden bin. Es unterscheidet nicht zwischen Groß- und Kleinschreibung - was praktisch ist. Wenn das angeforderte QS nicht vorhanden ist, wird nur eine leere Zeichenfolge zurückgegeben.
Ich benutze eine komprimierte Version davon. Ich poste unkomprimiert für Anfänger, um besser zu erklären, was los ist.
Ich bin mir sicher, dass dies optimiert oder anders gemacht werden könnte, um schneller zu arbeiten, aber es hat immer gut funktioniert, was ich brauche.
Genießen.
quelle
Wir haben gerade arg.js veröffentlicht , ein Projekt, das darauf abzielt, dieses Problem ein für alle Mal zu lösen. Es war traditionell so schwierig, aber jetzt können Sie Folgendes tun:
oder das ganze Los bekommen:
und wenn Sie sich für den Unterschied zwischen
?query=true
und interessieren#hash=true
, können Sie die MethodenArg.query()
undArg.hash()
verwenden.quelle
Das Problem mit der Top-Antwort auf diese Frage ist, dass die nicht unterstützten Parameter nach # stehen, aber manchmal auch benötigt wird, um diesen Wert zu erhalten.
Ich habe die Antwort so geändert, dass eine vollständige Abfragezeichenfolge mit einem Hash-Zeichen analysiert werden kann:
quelle
Und so können Sie diese Funktion unter der Annahme verwenden, dass die URL lautet
quelle
?stringtext&stringword=foo
.Wenn Sie Browserify verwenden, können Sie das
url
Modul von Node.js verwenden :Weiterführende Literatur: URL Node.js v0.12.2 Handbuch & Dokumentation
BEARBEITEN: Sie können die URL- Oberfläche verwenden, die in fast allen neuen Browsern weit verbreitet ist. Wenn der Code in einem alten Browser ausgeführt werden soll, können Sie eine Polyfüllung wie diese verwenden . Hier ist ein Codebeispiel zur Verwendung der URL-Schnittstelle zum Abrufen von Abfrageparametern (auch als Suchparameter bezeichnet).
Sie können auch URLSearchParams dafür verwenden. Hier ist ein Beispiel von MDN , um dies mit URLSearchParams zu tun:
quelle
url
API des Moduls ist hier: nodejs.org/api/url.html