Ich bin auf der Suche nach einem jQuery-Plugin, das URL-Parameter abrufen und diese Suchzeichenfolge unterstützen kann, ohne den JavaScript-Fehler "Missformed URI Sequence" auszugeben. Wenn es kein jQuery-Plugin gibt, das dies unterstützt, muss ich wissen, wie es geändert werden kann, um dies zu unterstützen.
?search=%E6%F8%E5
Der Wert des URL-Parameters sollte bei der Dekodierung wie folgt lauten:
æøå
(die Zeichen sind norwegisch).
Ich habe keinen Zugriff auf den Server, daher kann ich nichts daran ändern.
Sie sollten jQuery nicht für so etwas verwenden!
Die moderne Methode besteht darin, kleine wiederverwendbare Module über einen Paketmanager wie Bower zu verwenden.
Ich habe ein winziges Modul erstellt, das die Abfragezeichenfolge in ein Objekt zerlegen kann. Benutze es so:
// parse the query string into an object and get the property
queryString.parse(unescape(location.search)).search;
//=> æøå
function getURLParameter(name) {
return decodeURI(
(RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
);
}
Nachfolgend finden Sie das, was ich aus den Kommentaren hier erstellt habe, sowie das Beheben von Fehlern, die nicht erwähnt wurden (z. B. die tatsächliche Rückgabe von null und nicht von 'null'):
function getURLParameter(name) {
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}
Was Sie wirklich wollen, ist das jQuery URL Parser Plugin . Mit diesem Plugin sieht das Abrufen des Werts eines bestimmten URL-Parameters (für die aktuelle URL) folgendermaßen aus:
$.url().param('foo');
Wenn Sie ein Objekt mit Parameternamen als Schlüssel und Parameterwerten als Werten möchten, rufen Sie einfach param()
ohne ein Argument auf, wie folgt:
$.url().param();
Diese Bibliothek funktioniert auch mit anderen URLs, nicht nur der aktuellen:
$.url('http://allmarkedup.com?sky=blue&grass=green').param();
$('#myElement').url().param(); // works with elements that have 'src', 'href' or 'action' attributes
Da es sich um eine vollständige URL-Analysebibliothek handelt, können Sie auch andere Informationen aus der URL abrufen, z. B. den angegebenen Port oder den Pfad, das Protokoll usw.:
var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value');
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'
Es hat auch andere Funktionen. Weitere Dokumente und Beispiele finden Sie auf der Homepage .
Anstatt einen eigenen URI-Parser für diesen speziellen Zweck zu schreiben, funktioniert irgendwie in den meisten Verwenden Sie in diesen Fällen einen tatsächlichen URI-Parser. Abhängig von der Antwort kann Code aus anderen Antworten 'null'
Anstelle von null
zurückgeben, funktioniert nicht mit leeren Parametern (?foo=&bar=x
), Kann nicht alle Parameter analysieren und zurückgeben Wiederholt die Arbeit sofort, wenn Sie die URL wiederholt nach Parametern usw. abfragen.
Verwenden Sie einen tatsächlichen URI-Parser, erfinden Sie keinen eigenen.
Für diejenigen, die jQuery ablehnen, gibt es eine Version des Plugins, die reines JS ist .
Wenn Sie die URL-Parameter nicht kennen und ein Objekt mit den Schlüsseln und Werten in den Parametern erhalten möchten, können Sie Folgendes verwenden:
function getParameters() {
var searchString = window.location.search.substring(1),
params = searchString.split("&"),
hash = {};
if (searchString == "") return {};
for (var i = 0; i < params.length; i++) {
var val = params[i].split("=");
hash[unescape(val[0])] = unescape(val[1]);
}
return hash;
}
Aufruf von getParameters () mit einer URL wie /posts?date=9/10/11&author=nilbus
würde zurückkehren:
{
date: '9/10/11',
author: 'nilbus'
}
Ich werde den Code hier nicht einfügen, da er noch weiter von der Frage entfernt ist, aber weareon.net hat eine Bibliothek veröffentlicht, die auch die Manipulation der Parameter in der URL ermöglicht:
Sie können die native location.search -Eigenschaft des Browsers verwenden:
function getParameter(paramName) {
var searchString = window.location.search.substring(1),
i, val, params = searchString.split("&");
for (i=0;i<params.length;i++) {
val = params[i].split("=");
if (val[0] == paramName) {
return unescape(val[1]);
}
}
return null;
}
Es gibt jedoch einige jQuery-Plugins, die Ihnen helfen können:
Basierend auf der 999 Antwort :
function getURLParameter(name) {
return decodeURIComponent(
(location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1]
);
}
Änderungen:
decodeURI()
wird durch decodeURIComponent()
ersetzt[?|&]
Wird am Anfang des regulären Ausdrucks hinzugefügtDer Parameter i muss hinzugefügt werden, damit die Groß- und Kleinschreibung nicht beachtet wird:
function getURLParameter(name) {
return decodeURIComponent(
(RegExp(name + '=' + '(.+?)(&|$)', 'i').exec(location.search) || [, ""])[1]
);
}
$.urlParam = function(name){
var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(top.window.location.href);
return (results !== null) ? results[1] : 0;
}
$.urlParam("key");
Zum Beispiel eine Funktion, die den Wert einer beliebigen Parametervariable zurückgibt.
function GetURLParameter(sParam)
{
var sPageURL = window.location.search.substring(1);
var sURLVariables = sPageURL.split('&');
for (var i = 0; i < sURLVariables.length; i++)
{
var sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] == sParam)
{
return sParameterName[1];
}
}
}
Und so können Sie diese Funktion nutzen, vorausgesetzt, die URL lautet:
"http://example.com/?technology=jquery&blog=jquerybyexample".
var tech = GetURLParameter('technology');
var blog = GetURLParameter('blog');
Im obigen Code hat die Variable "tech" den Wert "jQuery" und die Variable "blog" den Wert "jquerybyexample".
Nachdem ich alle Antworten gelesen hatte, erhielt ich diese Version mit + einer zweiten Funktion, um Parameter als Flags zu verwenden
function getURLParameter(name) {
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)','i').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}
function isSetURLParameter(name) {
return (new RegExp('[?|&]' + name + '(?:[=|&|#|;|]|$)','i').exec(location.search) !== null)
}
jQuery-Code-Snippet zum Abrufen der in der URL gespeicherten dynamischen Variablen als Parameter und zum Speichern dieser Variablen als JavaScript-Variablen zur Verwendung mit Ihren Skripten:
$.urlParam = function(name){
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
if (results==null){
return null;
}
else{
return results[1] || 0;
}
}
example.com?param1=name¶m2=&id=6
$.urlParam('param1'); // name
$.urlParam('id'); // 6
$.urlParam('param2'); // null
//example params with spaces
http://www.jquery4u.com?city=Gold Coast
console.log($.urlParam('city'));
//output: Gold%20Coast
console.log(decodeURIComponent($.urlParam('city')));
//output: Gold Coast
<script type="text/javascript">
function getURLParameter(name) {
return decodeURIComponent(
(location.search.toLowerCase().match(RegExp("[?|&]" + name + '=(.+?)(&|$)')) || [, null])[1]
);
}
</script>
getURLParameter(id)
oder getURLParameter(Id)
Funktioniert genauso:)
Es gibt hier eine Menge fehlerhaften Code und Regex-Lösungen sind sehr langsam. Ich habe eine Lösung gefunden, die bis zu 20x schneller ist als das Gegenstück zu Regex und die elegant einfach ist:
/*
* @param string parameter to return the value of.
* @return string value of chosen parameter, if found.
*/
function get_param(return_this)
{
return_this = return_this.replace(/\?/ig, "").replace(/=/ig, ""); // Globally replace illegal chars.
var url = window.location.href; // Get the URL.
var parameters = url.substring(url.indexOf("?") + 1).split("&"); // Split by "param=value".
var params = []; // Array to store individual values.
for(var i = 0; i < parameters.length; i++)
if(parameters[i].search(return_this + "=") != -1)
return parameters[i].substring(parameters[i].indexOf("=") + 1).split("+");
return "Parameter not found";
}
console.log(get_param("parameterName"));
Regex ist nicht das A und O, für diese Art von Problem kann die einfache Manipulation von Zeichenfolgen sehr viel effizienter sein. Codequelle .