Nhận tham số URL thoát


302

Tôi đang tìm kiếm một plugin jQuery có thể nhận các tham số URL và hỗ trợ chuỗi tìm kiếm này mà không xuất ra lỗi JavaScript: "chuỗi URI không đúng định dạng". Nếu không có plugin jQuery hỗ trợ này, tôi cần biết cách sửa đổi nó để hỗ trợ.

?search=%E6%F8%E5

Giá trị của tham số URL, khi được giải mã, phải là:

æøå

(các nhân vật là người Na Uy).

Tôi không có quyền truy cập vào máy chủ, vì vậy tôi không thể sửa đổi bất cứ điều gì trên đó.



1
Lý do bạn nhận được "chuỗi URI không đúng định dạng" là do phần lớn các hàm sử dụng decodeURIComponent(). Các ký tự Na Uy rất có thể được mã hóa bằng cách sử dụng một cái gì đó như escape()và thay đổi decodeURIComponent()cuộc gọi thành một unescape()trợ giúp.
Kevin M

Xem câu trả lời của tôi cho một giải pháp hiện đại: stackoverflow.com/a/19992436/64949
Sindre Sorhus

Câu trả lời:


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

33
Với name = 'bar', tôi nghĩ rằng regex này sẽ phù hợp 'foobar=10'và trở lại '10'. Có lẽ bạn có thể thêm '[?|&]'vào lúc bắt đầu regrec của bạn. Chúc mừng!
Sébastien RoccaSerra

34
hàm này trả về 'null' thay vì null khi tham số không được xác định ... niềm vui của js ...
Damien

12
bạn có thể muốn "decodeURIComponent ()" thay vì "decodeURI ()", đặc biệt nếu bạn đang truyền dữ liệu thú vị như trả về URL dưới dạng tham số URL
cầu toàn

25
Điều này là tốt, nhưng decodeURIComponent thì tốt hơn, ví dụ tôi có hashtag (% 23) trong param của tôi sẽ bị decodeURI bỏ qua. Và tôi sẽ không trả về null, nhưng "", vì decodeURI (null) === "null", đó là một giá trị trả về kỳ lạ, "" là tốt hơn; bạn có thể làm if (! getURLParameter ("param")) thay vì if (getURLParameter ("param") === "null"). Vì vậy, phiên bản cải tiến của tôi: decodeURIComponent ((RegExp (name + '=' + '(. +?) (& | $)'). Exec (location.search) || [, ""]) [1])
standup75

3
Bỏ phiếu vì điều này trả về chuỗi bất kể kết quả có được tìm thấy hay không, và bất kể bạn đặt chuỗi thay thế nào, ví dụ [, null], vì kết quả được gói trong decodeURI đã biến mọi thứ thành chuỗi, Sanjeev đúng nhưng mã của anh ta đã không được kiểm tra chính xác và sao chép và dán đơn giản không hoạt động. function getURLParameter(name) { var p = RegExp(name + '=' + '(.+?)(&|$)').exec(location.search); if(!!p) { p = decodeURI(p[1]); } return p; }
Lukasz 'Severiaan' Grela

295

Dưới đây là những gì tôi đã tạo từ các nhận xét ở đây, cũng như sửa các lỗi không được đề cập (chẳng hạn như thực sự trả về null và không 'null'):

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

6
Làm thế nào về việc thêm newvào trước RegExp? Ít cảnh báo lint.
ripper234

18
Đây phải là câu trả lời được chấp nhận. Lấy lại null thực sự thay vì "null" là cách tốt hơn.
Nghệ thuật

11
Nếu bất cứ ai cần điều này được chuyển đổi thành coffeescript: getURLParameter: (name) -> return decodeURIComponent ((new RegExp ("[? | &] # {Name} = ([^ &;] +?) (& | ## |; | $) "). exec (location.search) || [null," "]) [1] .replace (/ \ + / g, '% 20')) || null;
Redbeard

1
@Redbeard - Không phải hàm của bạn có dấu '=' sau định nghĩa phương thức thay vì dấu hai chấm?
Zippie

1
Đây là phiên bản duy nhất của hàm tham số get-URL hoạt động với tôi với chuỗi UTF8.
chắc chắn

107

Những gì bạn thực sự muốn là plugin jQuery URL Parser . Với plugin này, việc nhận giá trị của một tham số URL cụ thể (đối với URL hiện tại) trông như thế này:

$.url().param('foo');

Nếu bạn muốn một đối tượng có tên tham số là khóa và giá trị tham số làm giá trị, bạn chỉ cần gọi param()mà không có đối số, như thế này:

$.url().param();

Thư viện này cũng hoạt động với các url khác, không chỉ thư mục hiện tại:

$.url('http://allmarkedup.com?sky=blue&grass=green').param();
$('#myElement').url().param(); // works with elements that have 'src', 'href' or 'action' attributes

Vì đây là toàn bộ thư viện phân tích cú pháp URL, bạn cũng có thể nhận thông tin khác từ URL, như cổng được chỉ định hoặc đường dẫn, giao thức, v.v .:

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'

Nó cũng có các tính năng khác, hãy xem trang chủ của nó để biết thêm các tài liệu và ví dụ.

Thay vì viết phân tích cú pháp URI của riêng bạn cho mục đích cụ thể này mà kinda làm việc trong hầu hết các trường hợp, sử dụng một phân tích cú pháp URI thực tế. Tùy thuộc vào câu trả lời, mã từ các câu trả lời khác có thể trả về 'null'thay vì null, không hoạt động với các tham số trống ( ?foo=&bar=x), không thể phân tích và trả về tất cả các tham số cùng một lúc, lặp lại công việc nếu bạn liên tục truy vấn URL cho các tham số, v.v.

Sử dụng trình phân tích cú pháp URI thực tế, không phát minh ra của riêng bạn.

Đối với những người không thích jQuery, có một phiên bản của plugin đó là JS thuần túy .


23
Câu hỏi là "lấy tham số URL với jQuery". Câu trả lời của tôi trả lời câu hỏi. Các câu trả lời khác hướng dẫn người dùng về cơ bản viết trình phân tích cú pháp URI của riêng mình cho trường hợp sử dụng cụ thể này, đây là một ý tưởng tồi tệ. Phân tích cú pháp của URI phức tạp hơn mọi người nghĩ.
Lucas

2
Đây là câu trả lời tôi đang tìm kiếm và rất jQuery-ish, không giống như một số câu trả lời khác.
Ehtesh Choudhury

Plugin có xử lý mã hóa URI hay tôi phải giải mã thủ công?
Roberto Linares

Câu hỏi cho biết "javascript" (tôi nghĩ nó có nghĩa là DOM trực tiếp) hoặc jQuery. Vì vậy, bất kỳ người khác sẽ làm.
brunoais

43

Nếu bạn không biết các tham số URL sẽ là gì và muốn nhận một đối tượng có các khóa và giá trị có trong các tham số, bạn có thể sử dụng điều này:

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

Gọi getParameter () bằng một url như /posts?date=9/10/11&author=nilbussẽ trả về:

{
  date:   '9/10/11',
  author: 'nilbus'
}

Tôi sẽ không bao gồm mã ở đây vì nó thậm chí còn cách xa câu hỏi hơn, nhưng weareon.net đã đăng một thư viện cho phép thao tác các tham số trong URL:


1
Vâng, điều này là tốt hơn để có được tất cả các thông số. Tất cả các giải pháp khác được liệt kê ở đây lặp lại regex cho mỗi param.
Bernard

Hàm này trả về một đối tượng khó xử: {"": undefined}khi URL không có tham số. Tốt nhất để trả về một đối tượng trống bằng cách sử dụng if(searchString=='') return {};trực tiếp sau khi searchStringgán.
Jordan Arseno

40

Bạn có thể sử dụng thuộc tính location.search của trình duyệt :

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

Nhưng có một số plugin jQuery có thể giúp bạn:


4
Điều này sạch sẽ hơn và dễ đọc hơn (và có thể không có lỗi) hơn tất cả các lớp lót regex.
Timmmm

8
Tôi sẽ đề nghị sử dụng decodeURIComponent () thay vì unescape ()
freedev

+1 này hoạt động cho các trình duyệt hiện đại nhưng một số nhà phát triển cần phải làm việc với ...: | IE8: S.
brunoais

25

Dựa trên câu trả lời của 999 :

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

Thay đổi:

  • decodeURI() được thay thế bằng decodeURIComponent()
  • [?|&] được thêm vào lúc bắt đầu

3
Có thể hữu ích cho người khác nếu bạn có thể giải thích lý do tại sao bạn thực hiện những thay đổi này. Thx
Timm

3
Không xử lý các thông số trống : ?a=&b=1. "[?&]"+name+"=([^&]*)"
Regrec

6

Cần thêm tham số i để làm cho trường hợp không nhạy cảm:

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

3

Sau khi đọc tất cả các câu trả lời, tôi đã kết thúc phiên bản này với + hàm thứ hai để sử dụng tham số làm cờ

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
Câu trả lời tốt, tuy nhiên chỉ là một cảnh báo. Mỗi JSHint, [, ""] có thể gây ra sự cố cho các trình duyệt cũ hơn. Vì vậy, sử dụng thay vì [null, ""] hoặc [không xác định, ""]. Vẫn còn một vài người trong chúng ta không hài lòng với vài người ủng hộ IE8 và tôi dám nói đó là IE7.
Delicia Brummitt

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

$.urlParam("key");

2

Ví dụ, một hàm trả về giá trị của bất kỳ biến tham số nào.

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];
        }
    }
}​

Và đây là cách bạn có thể sử dụng chức năng này với giả sử URL là,

"http://example.com/?tĩ=jquery&blog=jquerybyexample".

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

Vì vậy, trong biến mã trên, "tech" sẽ có "jQuery" là giá trị và biến "blog" sẽ là "jquerybyexample".


2

Bạn không nên sử dụng jQuery cho một cái gì đó như thế này!
Cách hiện đại là sử dụng các mô-đun nhỏ có thể tái sử dụng thông qua trình quản lý gói như Bower.

Tôi đã tạo một mô-đun nhỏ có thể phân tích chuỗi truy vấn thành một đối tượng. Sử dụng nó như thế này:

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

Nếu bạn nói rằng nó không hiện đại để có một khung, thì tốt thôi. Nhưng theo quan điểm của tôi, khung thực sự có vị trí của họ. jQuery trông ngày càng ít đẹp hơn đối với tôi.
Lodewijk

0

Có rất nhiều mã lỗi ở đây và các giải pháp regex rất chậm. Tôi đã tìm thấy một giải pháp hoạt động nhanh hơn tới 20 lần so với đối tác regex và rất đơn giản:

    /*
    *   @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 không phải là giải pháp tất cả và cuối cùng, đối với loại vấn đề này, thao tác chuỗi đơn giản có thể hoạt động hiệu quả hơn rất nhiều. Mã nguồn .


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

</script>

getURLParameter(id)hoặc getURLParameter(Id)Hoạt động giống nhau :)


0

Đoạn mã jQuery để lấy các biến động được lưu trữ trong url dưới dạng tham số và lưu trữ chúng dưới dạng các biến JavaScript sẵn sàng để sử dụng với các tập lệnh của bạn:

$.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

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

}

-1

Tôi đã tạo một hàm đơn giản để lấy tham số URL trong JavaScript từ một URL như thế này:

.....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");

ĐẦU RA: 18


2
Hãy cẩn thận khi đăng bản sao và dán câu trả lời soạn sẵn / nguyên văn cho nhiều câu hỏi, những câu hỏi này có xu hướng bị cộng đồng đánh dấu là "spam". Nếu bạn đang làm điều này thì điều đó thường có nghĩa là các câu hỏi là trùng lặp, vì vậy hãy gắn cờ chúng như vậy: stackoverflow.com/a/11808361/419
Kev

-1

Chỉ trong trường hợp các bạn có url như localhost / index.xsp? A = 1 # gì đó và bạn cần lấy thông số không phải là hàm băm.

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];
    }
}

-1

Sửa đổi nhẹ cho câu trả lời của @pauloppenheim, vì nó sẽ không xử lý đúng các tên tham số có thể là một phần của các tên tham số khác.

Ví dụ: Nếu bạn có tham số "appenv" & "env", việc lấy lại giá trị cho "env" có thể chọn giá trị "appenv".

Sửa chữa:

var urlParamVal = function (name) {
    var result = RegExp("(&|\\?)" + name + "=(.+?)(&|$)").exec(location.search);
    return result ? decodeURIComponent(result[2]) : "";
};

-2

Điều này có thể giúp đỡ.

<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
Mã này không được kiểm tra tốt. Đoán xem điều gì xảy ra với truy vấn?twothrids=text
Lyth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.