Nhận các giá trị url của tham số chuỗi truy vấn với jQuery / Javascript (chuỗi truy vấn)


149

Bất cứ ai cũng biết một cách tốt để viết một phần mở rộng jQuery để xử lý các tham số chuỗi truy vấn? Về cơ bản tôi muốn mở rộng ($)hàm ma thuật jQuery để tôi có thể làm một cái gì đó như thế này:

$('?search').val(); 

Cái nào sẽ cho tôi giá trị "kiểm tra" trong URL sau : http://www.example.com/index.php?search=test.

Tôi đã thấy rất nhiều hàm có thể làm điều này trong jQuery và Javascript, nhưng tôi thực sự muốn mở rộng jQuery để hoạt động chính xác như được hiển thị ở trên. Tôi không tìm kiếm một plugin jQuery, tôi đang tìm kiếm một phần mở rộng cho phương thức jQuery.


4
Đã hỏi và trả lời: stackoverflow.com/questions/901115/
Ấn

1
@NicoWesterdale - Tôi đã xem qua liên kết đó, nhưng không thấy câu trả lời nào giải quyết được câu hỏi cụ thể này. Anh nói anh muốn chính xác như trên.
mrtsherman

2
Tôi không nghĩ bạn có thể làm điều này, một chuỗi được truyền vào được phân tích cú pháp bởi sizzler, sau đó phân giải thành một mảng các đối tượng DOM. Bạn có thể mở rộng trình so khớp để cung cấp các bộ lọc tùy chỉnh, nhưng bạn không thể có một đối tượng jquery dựa trên một chuỗi.
Andrew

6
Không $quá tải?
Quentin

1
@mrtsherman Hãy xem hàm getParameterByName () trong liên kết tôi cung cấp. Không, bạn không thể làm điều đó trực tiếp trong dấu nhắc $, nhưng đó không phải là những gì bộ chọn jQuery dành cho. Anh ta chỉ chọn một phần của chuỗi URL, không cố truy cập một phần của DOM, đó là những gì $ () làm. Đó là một điều hoàn toàn khác. Nếu bạn thực sự muốn sử dụng jQuery, bạn có thể viết một plugin sử dụng cú pháp này: $ .getParameterByName (param), có một ví dụ nữa trên trang mà tôi đã liên kết với nó chính xác. Mặc dù vô nghĩa.
Nico Westerdale

Câu trả lời:


46

Sau nhiều năm phân tích chuỗi xấu xí, có một cách tốt hơn: URLSearchParams Hãy xem cách chúng tôi có thể sử dụng API mới này để nhận các giá trị từ vị trí!

// Giả sử "? Post = 1234 & hành động = chỉnh sửa"

var urlParams = new URLSearchParams(window.location.search);
console.log(urlParams.has('post')); // true
console.log(urlParams.get('action')); // "edit"
console.log(urlParams.getAll('action')); // ["edit"]
console.log(urlParams.toString()); // "?post=1234&action=edit"
console.log(urlParams.append('active', '1')); // "?

post=1234&action=edit&active=1"

CẬP NHẬT: IE không được hỗ trợ

sử dụng chức năng này từ câu trả lời bên dưới thay vì URLSearchParams

$.urlParam = function (name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)')
                      .exec(window.location.search);

    return (results !== null) ? results[1] || 0 : false;
}

console.log($.urlParam('action')); //edit

1
URLSearchParams có được hỗ trợ bởi tất cả các trình duyệt không?
thần thánh

Giáo sư! Ôi trời, IE không được hỗ trợ !! Tôi vừa thử nghiệm trên đó. Trong khi Chrome, FF, Safari không có vấn đề gì.
Saurin

1
@divine - Có một polyfill cho URLSearchParams tại đây: github.com/WebReflection/url-search-params
Roberto

Nếu bạn thêm một polyfill cho các trình duyệt không được hỗ trợ, giải pháp URLSearchParams này hoạt động tốt. github.com/ungap/url-search-params
Louisvdw

104

Tại sao mở rộng jQuery? Điều gì sẽ là lợi ích của việc mở rộng jQuery so với việc chỉ có một chức năng toàn cầu?

function qs(key) {
    key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, "\\$&"); // escape RegEx meta chars
    var match = location.search.match(new RegExp("[?&]"+key+"=([^&]+)(&|$)"));
    return match && decodeURIComponent(match[1].replace(/\+/g, " "));
}

http://jsfiddle.net/gilly3/sgxcL/

Một cách tiếp cận khác là phân tích toàn bộ chuỗi truy vấn và lưu trữ các giá trị trong một đối tượng để sử dụng sau. Cách tiếp cận này không yêu cầu biểu thức chính quy và mở rộng window.locationđối tượng (nhưng, có thể dễ dàng sử dụng biến toàn cục):

location.queryString = {};
location.search.substr(1).split("&").forEach(function (pair) {
    if (pair === "") return;
    var parts = pair.split("=");
    location.queryString[parts[0]] = parts[1] &&
        decodeURIComponent(parts[1].replace(/\+/g, " "));
});

http://jsfiddle.net/gilly3/YnCeu/

Phiên bản này cũng sử dụng Array.forEach(), vốn không có sẵn trong IE7 và IE8. Nó có thể được thêm bằng cách sử dụng triển khai tại MDN hoặc $.each()thay vào đó bạn có thể sử dụng jQuery .


2
Nó không phổ biến nhưng nó là hợp lệ để sử dụng dấu chấm phẩy thay vì ký hiệu trong các tham số truy vấn.
Muhd

@Muhd - Đó là "hợp lệ" để sử dụng bất kỳ dấu phân cách nào bạn muốn trong chuỗi truy vấn miễn là mã của bạn hiểu nó. Nhưng, khi một biểu mẫu được gửi, các trường biểu mẫu được gửi dưới dạng name=valuecặp, cách nhau bởi &. Nếu mã của bạn đang sử dụng định dạng chuỗi truy vấn tùy chỉnh, rõ ràng, bạn sẽ cần phải viết trình phân tích cú pháp chuỗi truy vấn tùy chỉnh ở bất cứ nơi nào chuỗi truy vấn được sử dụng, cho dù trên máy chủ hoặc máy khách.
gilly3

2
@nick - Thú vị. Nhưng đề xuất của họ cho các máy chủ HTTP để xử lý các dấu chấm phẩy vì ký hiệu chỉ dùng để làm cho HTML đẹp hơn khi sử dụng một liên kết để bắt chước một biểu mẫu. Nó chỉ là một gợi ý và không chuẩn. Một GETđệ trình biểu mẫu tiêu chuẩn được mã hóa thành application/x-www-form-urlencoded, với các giá trị được phân tách bằng &. Mã của tôi xử lý tiêu chuẩn đó. Các cấu trúc url tùy chỉnh như cấu trúc bạn đã liên kết sẽ cần phía máy chủ và trình khách của trình phân tích cú pháp tùy chỉnh. Bất kể, việc thêm khả năng như vậy vào mã của tôi ở trên sẽ là chuyện nhỏ.
gilly3

1
@gilly thực sự - nếu bạn muốn mã di động, bạn cần hỗ trợ cả hai
nick

1
Thêm "i" vào RegExp () để khóa có thể không phân biệt chữ hoa chữ thường: RegExp mới ("[? &]" + Key + "= ([^ &] +) (& | $)", "i"));
Yovav

94

Plugin JQuery jQuery-URL-Parser thực hiện cùng một công việc, ví dụ để lấy giá trị của chuỗi truy vấn tìm kiếm param, bạn có thể sử dụng

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

Thư viện này không được duy trì tích cực. Theo đề nghị của tác giả của plugin tương tự, bạn có thể sử dụng URI.js .

Hoặc bạn có thể sử dụng js-url thay thế. Nó khá giống với cái bên dưới.

Vì vậy, bạn có thể truy cập thông số truy vấn như $.url('?search')


2
Đẹp. Và mã nằm trong miền công cộng, do đó bạn thậm chí không phải đưa vào các bình luận.
Muhd

4
Giải pháp tốt nhưng sẽ không hiệu quả nếu bạn
tình cờ

1
Những gì phải làm bất cứ điều gì với, @kampj
RameshVel

3
Xin chào @kampj, thử nghiệm với file://giao thức sẽ khiến nhiều thứ không hoạt động. Bạn có thể tạo một máy chủ HTML tĩnh rất nhanh và dễ dàng với node.js. stackoverflow.com/questions/16333790/ Mạnh
Jess

2
Plugin này không còn được duy trì và chính tác giả đang đề nghị sử dụng các plugin khác thay thế.
JanErikGunnar

77

Tìm thấy viên ngọc này từ bạn bè của chúng tôi tại SitePoint. https://www.sitepoint.com/url-parameter-jquery/ .

Sử dụng jQuery PURE. Tôi chỉ sử dụng này và nó đã làm việc. Tinh chỉnh nó một chút ví dụ vì lợi ích.

//URL is http://www.example.com/mypage?ref=registration&email=bobo@example.com

$.urlParam = function (name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)')
                      .exec(window.location.search);

    return (results !== null) ? results[1] || 0 : false;
}

console.log($.urlParam('ref')); //registration
console.log($.urlParam('email')); //bobo@example.com

Sử dụng như bạn muốn.


Tuyệt quá. Cảm ơn! Tôi không nghĩ rằng bạn cần thẻ kết thúc cuối cùng mặc dù.
bhtabor

À đúng rồi, bạn đúng rồi. Chỉnh sửa bài. Đó là phần còn lại từ một số câu lệnh if trong mã của tôi. Cảm ơn.
ClosDesign

1
Bạn nên sử dụng window.location.search thay vì .href - nếu không, tốt.
BrainSlugs83

4
Thay vì results[1] || 0, bạn phải làm nếu (kết quả) {trả về kết quả [1]} return 0; tham số truy vấn bcoz có thể không có mặt ở tất cả. Và sửa đổi sẽ xử lý tất cả các trường hợp chung.
myDoggyWritesCode

1
Bạn làm gì nếu bạn có một cái gì đó như thế https://example.com/?c=Order+IDnào? Dấu cộng đó vẫn còn trên chức năng này.
Volomike

47

Đây không phải là mẫu mã của tôi, nhưng tôi đã sử dụng nó trong quá khứ.

//First Add this to extend jQuery

    $.extend({
      getUrlVars: function(){
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for(var i = 0; i < hashes.length; i++)
        {
          hash = hashes[i].split('=');
          vars.push(hash[0]);
          vars[hash[0]] = hash[1];
        }
        return vars;
      },
      getUrlVar: function(name){
        return $.getUrlVars()[name];
      }
    });

    //Second call with this:
    // Get object of URL parameters
    var allVars = $.getUrlVars();

    // Getting URL var by its name
    var byName = $.getUrlVar('name');

2
Bạn không nên chia thành '=', về mặt kỹ thuật sẽ ổn khi có dấu thứ hai bằng giá trị của bất kỳ cặp khóa / giá trị nào. - Chỉ có dấu bằng đầu tiên bạn gặp (mỗi cặp khóa / giá trị) mới được coi là dấu phân cách. (Ngoài ra, dấu bằng không được yêu cầu nghiêm ngặt; có thể có khóa không có giá trị.)
BrainSlugs83

Dung dịch sạch. Làm việc hoàn hảo trong trường hợp của tôi.
JF Gagnon

$ .extend ({getUrlVars: function () {var vars = [], hash; var hashes = window.location.href.slice (window.location.href.indexOf ('?') + 1) .split ('& '); for (var i = 0; i <hashes.length; i ++) {hash = băm [i] .split (' = '); var k = hash.shift (); vars.push (k); vars [k] = hash.join ("");} return vars;}, getUrlVar: function (name) {return $ .getUrlVars () [name];}});
Mupinc

15

Tôi đã viết một hàm nhỏ trong đó bạn chỉ phải phân tích tên của tham số truy vấn. Vì vậy, nếu bạn có :? Project = 12 & Mode = 200 & date = 2013-05-27 và bạn muốn tham số 'Chế độ', bạn chỉ phải phân tích tên 'Chế độ' thành hàm:

function getParameterByName( name ){
    var regexS = "[\\?&]"+name+"=([^&#]*)", 
  regex = new RegExp( regexS ),
  results = regex.exec( window.location.search );
  if( results == null ){
    return "";
  } else{
    return decodeURIComponent(results[1].replace(/\+/g, " "));
  }
}

// example caller:
var result =  getParameterByName('Mode');

Nếu tên của bạn không có rác, bạn có thể bỏ regex đầu tiên và sẽ hợp lý hơn khi bắt đầu từ location.search
mplungjan

7

Dựa trên câu trả lời của @Rob Neild ở trên, đây là một điều chỉnh JS thuần túy trả về một đối tượng đơn giản của các tham số chuỗi truy vấn được giải mã (không có% 20, v.v.).

function parseQueryString () {
  var parsedParameters = {},
    uriParameters = location.search.substr(1).split('&');

  for (var i = 0; i < uriParameters.length; i++) {
    var parameter = uriParameters[i].split('=');
    parsedParameters[parameter[0]] = decodeURIComponent(parameter[1]);
  }

  return parsedParameters;
}

Tôi chưa thấy lỗi nào khi sử dụng mã này. Bạn đang dùng trình duyệt nào? Tôi đã thử nghiệm nó với Firefox, Chrome và Safari hiện tại.

Vâng xin lỗi tôi đọc nhầm. Tôi nghĩ rằng tôi đã thấy nó gọi một phương thức trên một cái gì đó đang trở lại không xác định. Vì vậy, thực sự nó chỉ chạy một lần khi nó không phải. Khi tìm kiếm là "". Và bạn nhận được {"": "không xác định"}
Jerinaw

Vâng. Điều đó có thể có thể sử dụng một số tinh chế.

1

Viết bằng Vanilla Javascript

     //Get URL
     var loc = window.location.href;
     console.log(loc);
     var index = loc.indexOf("?");
     console.log(loc.substr(index+1));
     var splitted = loc.substr(index+1).split('&');
     console.log(splitted);
     var paramObj = [];
     for(var i=0;i<splitted.length;i++){
         var params = splitted[i].split('=');
         var key = params[0];
         var value = params[1];
         var obj = {
             [key] : value
         };
         paramObj.push(obj);
         }
    console.log(paramObj);
    //Loop through paramObj to get all the params in query string.

1
function parseQueryString(queryString) {
    if (!queryString) {
        return false;
    }

    let queries = queryString.split("&"), params = {}, temp;

    for (let i = 0, l = queries.length; i < l; i++) {
        temp = queries[i].split('=');
        if (temp[1] !== '') {
            params[temp[0]] = temp[1];
        }
    }
    return params;
}

Tôi sử dụng cái này

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.