2009-09-10 4 views
297

Я ищу плагин jQuery, который может получить параметры URL и поддерживать эту строку поиска без вывода ошибки JavaScript: «неправильная последовательность URI». Если для этого не поддерживается плагин jQuery, мне нужно знать, как его модифицировать, чтобы поддержать это.Получить escape-код URL

?search=%E6%F8%E5 

Значение параметра URL, при декодировании, должно быть:

æøå 

(персонажи норвежского).

У меня нет доступа к серверу, поэтому я ничего не могу изменить.

+9

взглянуть на HTTP : //stackoverflow.com/questions/901115/get-querystring-with-jquery/901144#901144 –

+1

Причина, по которой вы получаете «неправильную последовательность URI», заключается в том, что большинство функций используют 'decodeURIComponent()'. Норвежские символы, скорее всего, были закодированы с использованием чего-то вроде 'escape()', и изменение вызова 'decodeURIComponent()' на 'unescape()' должно помочь. –

+0

См. Мой ответ на современное решение: http://stackoverflow.com/a/19992436/64949 –

ответ

2

Вы не должны использовать JQuery что-то вроде этого!
Современный способ заключается в использовании небольших модулей многократного использования через пакет-менеджера, такого как Bower.

Я создал крошечный module, который может анализировать строку запроса в объекте. Используйте его так:

// parse the query string into an object and get the property 
queryString.parse(unescape(location.search)).search; 
//=> æøå 
+0

Если вы говорите, что это не современная инфраструктура, все в порядке. Но, на мой взгляд, рамки действительно имеют свое место. Однако jQuery выглядит все менее привлекательным для меня. – Lodewijk

40

Вы можете использовать браузер родной 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, которые могут вам помочь:

+4

Это намного более чистый и читаемый (и, вероятно, более простой), чем все эти однострочные регулярные выражения. – Timmmm

+8

Я предлагаю использовать decodeURIComponent() вместо unescape() – freedev

+0

+1 это работает для современных браузеров, но некоторые разработчики должны работать с ...: | IE8: S. – brunoais

416
function getURLParameter(name) { 
    return decodeURI(
     (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1] 
    ); 
} 
+33

С 'name = 'bar'', я думаю, что это регулярное выражение будет соответствовать'' foobar = 10'' и возвращает '' 10''. Возможно, вы могли бы добавить '' [? | &] ''В начале вашего регулярного выражения. Ура! –

+34

эта функция возвращает «null» вместо null, когда параметр не определен ... радость js ... – Damien

+11

вы можете захотеть «decodeURIComponent()» вместо «decodeURI()», особенно если вы передаете интересные данные как возвращать URL-адреса в качестве параметра URL – perfectionist

26

На основе 999's answer:

function getURLParameter(name) { 
    return decodeURIComponent(
     (location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1] 
    ); 
} 

Изменения:

  • decodeURI() заменяется decodeURIComponent()
  • [?|&] добавляют в начале регулярного выражения
+3

Может быть полезно для других, если вы могли бы объяснить, почему вы внесли эти изменения. Thx – Timm

+3

Не обрабатывает пустые параметры: '? A = & b = 1'. Лучше regexp будет: '" [? &] "+ Name +" = ([^ &] *) "' – serg

-1
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"; 
    } 

} 
291

Ниже то, что я создал из комментариев здесь, а также исправление ошибок не упоминается (например, на самом деле возвращение нулевой, а не «нулевой»):

function getURLParameter(name) { 
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null; 
} 
+6

Как насчет добавления 'new' перед RegExp? Меньше предупреждений. – ripper234

+2

Конечно, он был добавлен. – radicand

+17

Это должен быть принятый ответ. Получение реального значения null вместо «null» лучше. – Art

43

Если вы не знаете, какие параметры 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 тоже:

+1

Да, это лучше получить все параметры.Все остальные решения, перечисленные здесь, повторяют регулярное выражение для каждого параметра. – Alkaline

+0

Эта функция возвращает неудобный объект: '{" ": undefined}', когда URL-адрес не имеет параметров. Лучше всего вернуть пустой объект с помощью 'if (searchString == '') return {};' непосредственно после назначения 'searchString'. –

2
$.urlParam = function(name){ 
    var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(top.window.location.href); 
    return (results !== null) ? results[1] : 0; 
} 

$.urlParam("key"); 
106

То, что вы действительно хотите это 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' 

Он имеет и другие функции, а также, проверить его homepage для более документации и примеров.

Вместо того чтобы писать свой собственный URI анализатор для этой конкретной цели, которые своего рода работает в самых случаях использовать фактический URI анализатор. В зависимости от ответа код из других ответов может возвращать 'null' вместо null, не работает с пустыми параметрами (?foo=&bar=x), не может разобрать и вернуть все параметры сразу, повторяет работу, если вы повторно запрашиваете URL-адрес параметров и т. Д. .

Используйте фактический парсер URI, не придумывайте свои собственные.

Для тех, кто не любит jQuery, есть a version of the plugin that's pure JS.

+23

Вопрос: «Получить URL-параметр с помощью jQuery». Мой ответ отвечает на вопрос. В других ответах пользователь должен в принципе написать свой собственный парсер URI для этого конкретного случая использования, что является ужасной идеей. Разбор URI более сложный, чем люди думают. – Lucas

+2

Это ответ, который я искал, и очень jQuery-ish, в отличие от некоторых других ответов. –

+0

Включает ли плагин кодировку URI или мне нужно ее декодировать вручную? –

-1

Я создал простую функцию, чтобы получить параметр 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

+2

Будьте осторожны при публикации копий и вставных шаблонов/дословных ответов на несколько вопросов, они, как правило, помечены сообществом сообществом. Если вы это делаете, это обычно означает, что вопросы являются дубликатами, поэтому отмечайте их как таковые: http://stackoverflow.com/a/11808489/419 – Kev

-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> 
+1

Этот код не проверен правильно. Угадайте, что происходит с запросом '? Twothrids = text' – Lyth

-1

Только в случае, если вы, ребята, есть URL, как LOCALHOST/index.xsp? А = 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]; 
    } 
} 
6

нужно добавить параметр я сделать это чувствительно к регистру:

function getURLParameter(name) { 
    return decodeURIComponent(
     (RegExp(name + '=' + '(.+?)(&|$)', 'i').exec(location.search) || [, ""])[1] 
    ); 
    } 
2

Например, функция, которая возвращает значение любых параметров переменных.

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 & блог = jquerybyexample".

var tech = GetURLParameter('technology'); 
var blog = GetURLParameter('blog'); 

Таким образом, в приведенном выше коде переменной «технологии» будет иметь «Jquery» в качестве значения и «блог» переменная будет «jquerybyexample».

1

После прочтения всех ответов я закончил с этой версией с + второй функцией использовать параметры как флаги

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) 
} 
+2

Хороший ответ, только одно предупреждение. Per JSHint [, ""] может вызвать проблемы для старых браузеров. Итак, используйте вместо этого [null, ""] или [undefined, ""]. Есть еще некоторые из нас, недовольные немногими, которые поддерживают IE8 и осмеливаются сказать это IE7. –

0

Там много багги коды здесь и регулярные выражения решения очень медленно. Я нашел решение, которое работает до 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 не будут и конец все решение, для этого типа манипуляции проблемы простой строки может поработать огромное количество более эффективно. Code source.

-1

Небольшая модификация ответа от @pauloppenheim, так как она не будет правильно обрабатывать имена параметров, которые могут быть частью других имен параметров.

Например: Если у вас есть «appenv» & «env», то значение «env» может занять значение «appenv».

Fix:

var urlParamVal = function (name) { 
    var result = RegExp("(&|\\?)" + name + "=(.+?)(&|$)").exec(location.search); 
    return result ? decodeURIComponent(result[2]) : ""; 
}; 
0
<script type="text/javascript"> 
function getURLParameter(name) { 
     return decodeURIComponent(
      (location.search.toLowerCase().match(RegExp("[?|&]" + name + '=(.+?)(&|$)')) || [, null])[1] 
     ); 
    } 

</script> 

getURLParameter(id) или getURLParameter(Id) Работает так же:)

0

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&param2=&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 
Смежные вопросы