我正在寻找一个jQuery插件,可以获得URL参数,并支持这个搜索字符串而不输出JavaScript错误:“畸形的URI序列”。如果没有jQuery插件支持这一点,我需要知道如何修改它来支持这一点。
?search=%E6%F8%E5
URL参数的值,当解码时,应该是:
æøå
(人物是挪威人)。
我没有访问服务器的权限,所以我不能在上面修改任何东西。
我正在寻找一个jQuery插件,可以获得URL参数,并支持这个搜索字符串而不输出JavaScript错误:“畸形的URI序列”。如果没有jQuery插件支持这一点,我需要知道如何修改它来支持这一点。
?search=%E6%F8%E5
URL参数的值,当解码时,应该是:
æøå
(人物是挪威人)。
我没有访问服务器的权限,所以我不能在上面修改任何东西。
当前回答
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 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插件可以帮助你:
查询对象 getURLParam
这里有很多有bug的代码,正则表达式解决方案非常慢。我发现了一个解决方案,比正则表达式对应的工作速度快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并不是最重要的解决方案,对于这类问题,简单的字符串操作可以更有效地工作。代码源。
在阅读了所有的答案后,我最终得到了这个版本+第二个使用参数作为标志的函数
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 URL解析器插件。使用这个插件,获取特定URL参数的值(对于当前URL)看起来像这样:
$.url().param('foo');
如果你想要一个以参数名为键,以参数值为值的对象,你只需要调用不带参数的param(),就像这样:
$.url().param();
这个库也适用于其他url,而不仅仅是当前的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版本。
function getURLParameter(name) {
return decodeURI(
(RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
);
}