Получить экранированный URL-адрес
Я ищу плагин jQuery, который может получить параметры URL и поддерживать эту строку поиска без вывода ошибки JavaScript: "неправильная последовательность URI". Если для этого не поддерживается плагин jQuery, мне нужно знать, как его изменить, чтобы поддержать это.
?search=%E6%F8%E5
Значение параметра URL при декодировании должно быть:
æøå
(символы норвежские).
У меня нет доступа к серверу, поэтому я ничего не могу изменить.
Ответы
Ответ 1
Вы не должны использовать jQuery для чего-то подобного!
Современный способ заключается в использовании небольших модулей многократного использования через менеджера пакетов, например, Bower.
Я создал маленький который может анализировать строку запроса в объекте. Используйте его так:
// parse the query string into an object and get the property
queryString.parse(unescape(location.search)).search;
//=> æøå
Ответ 2
function getURLParameter(name) {
return decodeURI(
(RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
);
}
Ответ 3
Ниже приведено то, что я создал из комментариев здесь, а также исправление ошибок, не упомянутых (например, фактическое возвращение null, а не "null" ):
function getURLParameter(name) {
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}
Ответ 4
Что вы действительно хотите, это плагин jQuery URL Parser. С помощью этого плагина получение значения определенного 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.
Ответ 5
Если вы не знаете, какие параметры 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:
Ответ 6
Вы можете использовать собственное свойство браузера location.search:
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, которые могут вам помочь:
Ответ 7
На основе ответа 999:
function getURLParameter(name) {
return decodeURIComponent(
(location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1]
);
}
Изменения:
-
decodeURI()
заменяется на decodeURIComponent()
-
[?|&]
добавляется в начале регулярного выражения
Ответ 8
Необходимо добавить параметр i, чтобы сделать регистр нечувствительным:
function getURLParameter(name) {
return decodeURIComponent(
(RegExp(name + '=' + '(.+?)(&|$)', 'i').exec(location.search) || [, ""])[1]
);
}
Ответ 9
$.urlParam = function(name){
var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(top.window.location.href);
return (results !== null) ? results[1] : 0;
}
$.urlParam("key");
Ответ 10
Например, функция, которая возвращает значение любой переменной параметра.
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".
Ответ 11
После прочтения всех ответов я закончил эту версию с + второй функцией, чтобы использовать параметры в виде флагов
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)
}
Ответ 12
Здесь много ошибок, а решения regex очень медленные. Я нашел решение, которое работает до 20 раз быстрее, чем регулярное выражение и элегантно просто:
/*
* @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 - это не все-все и конечное решение, для такого типа задач простые манипуляции с строками могут работать более эффективно. Источник кода.
Ответ 13
<script type="text/javascript">
function getURLParameter(name) {
return decodeURIComponent(
(location.search.toLowerCase().match(RegExp("[?|&]" + name + '=(.+?)(&|$)')) || [, null])[1]
);
}
</script>
getURLParameter(id)
или getURLParameter(id)
Работает одинаково:)
Ответ 14
фрагмент кода 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
Ответ 15
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";
}
}
Ответ 16
Я создал простую функцию, чтобы получить параметр 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
Ответ 17
На всякий случай у вас есть URL-адрес, например localhost/index.xsp? a = 1 #, и вам нужно получить параметр не хэш.
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];
}
}
Ответ 18
Незначительное изменение ответа от @pauloppenheim, так как оно не будет правильно обрабатывать имена параметров, которые могут быть частью других имен параметров.
Например: если у вас есть параметры "appenv" и "env", redeaing значение для "env" может получить значение "appenv".
Fix:
var urlParamVal = function (name) {
var result = RegExp("(&|\\?)" + name + "=(.+?)(&|$)").exec(location.search);
return result ? decodeURIComponent(result[2]) : "";
};
Ответ 19
Это может помочь.
<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>