Получить экранированный параметр URL
Я ищу плагин jQuery, который может получать параметры URL и поддерживать эту строку поиска без вывода ошибки JavaScript: "неправильная последовательность URI". Если нет плагина jQuery, который поддерживает это, мне нужно знать, как изменить его для поддержки этого.
?search=%E6%F8%E5
значение параметра URL при декодировании должно быть:
æøå
(символы норвежские).
Я не имею доступа к серверу, поэтому я не могу ничего изменить оно.
19 ответов:
function getURLParameter(name) { return decodeURI( (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1] ); }
ниже то, что я создал из комментариев здесь, а также исправляя ошибки, не упомянутые (например, фактически возвращая null, а не 'null'):
function getURLParameter(name) { return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null; }
то, что вы действительно хотите, это jQuery url Parser plugin. С помощью этого плагина получение значения определенного параметра URL (для текущего URL) выглядит следующим образом:
$.url().param('foo');если вам нужен объект с именами параметров в качестве ключей и значениями параметров в качестве значений, вы просто вызовете
param()без аргументов, вот так:$.url().param();эта библиотека также работает с другими URL-адресами, а не только с текущим:
$.url('http://allmarkedup.com?sky=blue&grass=green').param(); $('#myElement').url().param(); // works with elements that have 'src', 'href' or 'action' attributesтак как это целый Библиотека синтаксического анализа URL-адресов, вы также можете получить другую информацию из URL-адреса, например, указанный порт или путь, протокол и т. д.:
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'он имеет и другие функции, проверьте его Домашняя страница для получения дополнительных документов и примеров.
вместо того, чтобы писать свой собственный парсер URI для этой конкретной цели, что вроде работает в большинство случаи, используйте фактический анализатор URI. В зависимости от ответа, код из других ответов может вернуть
'null'вместоnull, не работает с пустыми параметрами (?foo=&bar=x), не может анализировать и возвращать все параметры сразу, повторяет работу, если вы повторно запрашиваете URL для параметров и т. д.используйте фактический парсер URI, не изобретайте свой собственный.
для тех, кто не любит jQuery, есть версия плагина, который является чистым JS.
Если вы не знаете, какие параметры URL будут и хотят получить объект с ключами и значениями параметров, вы можете использовать это:
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; }вызов getParameters () с url как
/posts?date=9/10/11&author=nilbusвернутся:{ date: '9/10/11', author: 'nilbus' }Я не буду включать код здесь, так как это еще дальше от вопроса, но weareon.net размещена библиотека, которая позволяет манипулировать параметрами в URL тоже:
вы можете использовать браузер уроженца расположение.поиск свойства:
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; }но есть некоторые плагины jQuery, которые могут помочь вам:
на основе 999-х:
function getURLParameter(name) { return decodeURIComponent( (location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1] ); }изменения:
decodeURI()заменяетсяdecodeURIComponent()[?|&]добавляется в начале регулярного выражения
нужно добавить параметр I, чтобы сделать его нечувствительным к регистру:
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");
например, функция, которая возвращает значение любой переменной параметров.
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]; } } }и вот как вы можете использовать эту функцию, предполагая, что URL-адрес,
"http://example.com/?technology=jquery&blog=jquerybyexample".
var tech = GetURLParameter('technology'); var blog = GetURLParameter('blog');таким образом, в приведенной выше переменной кода "tech" будет иметь значение "jQuery", а переменная "blog" будет "jquerybyexample".
вы не должны использовать jQuery для чего-то подобного!
Современный способ заключается в использовании небольших многоразовых модулей через пакет-менеджер, такой как Bower.Я создал крошечную модуль который может анализировать строку запроса в объект. Используйте его так:
// parse the query string into an object and get the property queryString.parse(unescape(location.search)).search; //=> æøå
после прочтения всех ответов я закончил с этой версией с + второй функцией для использования параметров в качестве флагов
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) }
здесь много глючного кода, и решения регулярных выражений очень медленные. Я нашел решение, которое работает до 20 раз быстрее, чем аналог regex и элегантно просто:
/* * @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"));регулярное выражение не является универсальным и конечным решением, для этого типа проблемы простая манипуляция строками может работать намного эффективнее. исходный код.
<script type="text/javascript"> function getURLParameter(name) { return decodeURIComponent( (location.search.toLowerCase().match(RegExp("[?|&]" + name + '=(.+?)(&|$)')) || [, null])[1] ); } </script>
getURLParameter(id)илиgetURLParameter(Id)работает так же : )
фрагмент кода jQuery, чтобы получить динамические переменные, хранящиеся в url-адресе в качестве параметров, и сохранить их в качестве переменных JavaScript, готовых к использованию с вашими сценариями:
$.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
function getURLParameters(paramName) { var sURL = window.document.URL.toString(); if (sURL.indexOf("?") > 0) { var arrParams = sURL.split("?"); var arrURLParams = arrParams[1].split("&"); var arrParamNames = new Array(arrURLParams.length); var arrParamValues = new Array(arrURLParams.length); var i = 0; for (i=0;i<arrURLParams.length;i++) { var sParam = arrURLParams[i].split("="); arrParamNames[i] = sParam[0]; if (sParam[1] != "") arrParamValues[i] = unescape(sParam[1]); else arrParamValues[i] = "No Value"; } for (i=0;i<arrURLParams.length;i++) { if(arrParamNames[i] == paramName){ //alert("Param:"+arrParamValues[i]); return arrParamValues[i]; } } return "No Parameters Found"; } }
Я создал простую функцию для получения параметра URL в JavaScript из такого URL:
.....58e/web/viewer.html?page=*17*&getinfo=33 function buildLinkb(param) { var val = document.URL; var url = val.substr(val.indexOf(param)) var n=parseInt(url.replace(param+"=","")); alert(n+1); } buildLinkb("page");выход:
18
только в случае, если вы, ребята, есть URL-адрес, как индекс на localhost/.и Xsp?a=1#что-то, и вам нужно получить param не хэш.
var vars = [], hash, anchor; var q = document.URL.split('?')[1]; if(q != undefined){ q = q.split('&'); for(var i = 0; i < q.length; i++){ hash = q[i].split('='); anchor = hash[1].split('#'); vars.push(anchor[0]); vars[hash[0]] = anchor[0]; } }
небольшая модификация ответа @pauloppenheim, так как он не будет правильно обрабатывать имена параметров, которые могут быть частью других имен параметров.
например: если у вас есть параметры "appenv" & "env", выкуп значения для "env" может забрать значение "appenv".
исправления:
var urlParamVal = function (name) { var result = RegExp("(&|\?)" + name + "=(.+?)(&|$)").exec(location.search); return result ? decodeURIComponent(result[2]) : ""; };
Это может помочь.
<script type="text/javascript"> $(document).ready(function(){ alert(getParameterByName("third")); }); function getParameterByName(name){ var url = document.URL, count = url.indexOf(name); sub = url.substring(count); amper = sub.indexOf("&"); if(amper == "-1"){ var param = sub.split("="); return param[1]; }else{ var param = sub.substr(0,amper).split("="); return param[1]; } } </script>
Comments