làm thế nào để lấy các biến GET và POST với JQuery?


95

Làm cách nào để tôi chỉ cần lấy GETPOSTcác giá trị với JQuery?

Những gì tôi muốn làm là một cái gì đó như thế này:

$('#container-1 > ul').tabs().tabs('select', $_GET('selectedTabIndex'));

Câu trả lời:


170

Đối với các tham số GET, bạn có thể lấy chúng từ document.location.search:

var $_GET = {};

document.location.search.replace(/\??(?:([^=]+)=([^&]*)&?)/g, function () {
    function decode(s) {
        return decodeURIComponent(s.split("+").join(" "));
    }

    $_GET[decode(arguments[1])] = decode(arguments[2]);
});

document.write($_GET["test"]);

Đối với tham số POST, bạn có thể tuần tự hóa $_POSTđối tượng ở định dạng JSON thành một <script>thẻ:

<script type="text/javascript">
var $_POST = <?php echo json_encode($_POST); ?>;

document.write($_POST["test"]);
</script>

Trong khi bạn đang ở đó (làm mọi việc ở phía máy chủ), bạn cũng có thể thu thập các tham số GET trên PHP:

var $_GET = <?php echo json_encode($_GET); ?>;

Lưu ý: Bạn sẽ cần phiên bản PHP 5 trở lên để sử dụng json_encodechức năng tích hợp sẵn.


Cập nhật: Đây là cách triển khai chung chung hơn:

function getQueryParams(qs) {
    qs = qs.split("+").join(" ");
    var params = {},
        tokens,
        re = /[?&]?([^=]+)=([^&]*)/g;

    while (tokens = re.exec(qs)) {
        params[decodeURIComponent(tokens[1])]
            = decodeURIComponent(tokens[2]);
    }

    return params;
}

var $_GET = getQueryParams(document.location.search);

3
Phương pháp trích xuất của bạn không xem xét các đối số không có giá trị (”? Foo & bar = baz“ => {foo: "", bar: "baz"}).
Gumbo

1
Gumbo bắt rất tốt! Dấu = trong regex nên được làm tùy chọn: ... snip ... (?: = ([^ &] *))? &?) / G
Ates Goral

1. Ví dụ GET đầu tiên của bạn dường như không hiệu quả với tôi. 2. Trong bản cập nhật của bạn, tên hàm của bạn có một lỗi đánh máy trong đó
Jake Wilson

Bạn đã thử chạy nó trong safari hoặc chrome chưa? Nó tạo ra một vòng lặp vô hạn và làm sập trình duyệt. Hãy thử nó với một cái gì đó đơn giản như "? P = 2"
MrColes

@MrColes: Rất tiếc. Đã lâu rồi tôi không viết cái này. Kể từ đó, tôi đã phát hiện ra rằng Webkit không cập nhật bộ đếm vị trí bên trong của đối tượng RegExp khi nó được sử dụng dưới dạng chữ. Tôi sẽ cập nhật câu trả lời của mình với bản sửa lỗi.
Ates Goral

16

Có một plugin cho jQuery để nhận các tham số GET được gọi là .getUrlParams

Đối với POST, giải pháp duy nhất là lặp lại POST thành một biến javascript bằng PHP, như Moran đã đề xuất.


6

tại sao không sử dụng PHP cũ tốt? ví dụ: giả sử chúng tôi nhận được tham số GET 'target':

function getTarget() {
    var targetParam = "<?php  echo $_GET['target'];  ?>";
    //alert(targetParam);
}

7
Vì đây là giải pháp phía máy chủ và câu hỏi là về phía máy khách / javascript / jQuery.
Hrvoje Kusulja

@hkusulja thêm sự xúc phạm đến thương tích: mặc dù bạn khẳng định điều đó, tôi vẫn không thể thấy rằng câu hỏi chỉ là phía máy chủ. tôi cảm thấy dày như một công cụ ...
gil tony

1
Kịch bản này thật gớm ghiếc. Sử dụng điều này nếu bạn muốn trang web của mình bị tấn công. Luôn thoát khỏi các biến do người dùng nhập !! KHÔNG xuất $ _GET trực tiếp.
charj

5

Hoặc bạn có thể sử dụng cái này http://plugins.jquery.com/project/parseQuery , nó nhỏ hơn hầu hết (449 byte được rút gọn), trả về một đối tượng đại diện cho các cặp tên-giá trị.


3

Với bất kỳ ngôn ngữ phía máy chủ nào, bạn sẽ phải phát các biến POST thành javascript.

.MẠNG LƯỚI

var my_post_variable = '<%= Request("post_variable") %>';

Chỉ cần cẩn thận với các giá trị trống. Nếu biến bạn cố gắng phát ra thực sự trống, bạn sẽ gặp lỗi cú pháp javascript. Nếu bạn biết đó là một chuỗi, bạn nên đặt nó trong dấu ngoặc kép. Nếu đó là một số nguyên, bạn có thể muốn kiểm tra xem nó có thực sự tồn tại hay không trước khi viết dòng vào javascript.


1
Tuy nhiên, không phải lúc nào bạn cũng có quyền truy cập vào các ngôn ngữ phía máy chủ. Ví dụ các trang GitHub ...
Adam B


2

Đây là thứ để thu thập tất cả các GETbiến trong một đối tượng toàn cục, một quy trình được tối ưu hóa trong vài năm. Kể từ sự nổi lên của jQuery, bây giờ có vẻ thích hợp để lưu trữ chúng trong chính jQuery, tôi đang kiểm tra với John về một triển khai cốt lõi tiềm năng.

jQuery.extend({
    'Q' : window.location.search.length <= 1 ? {}
        : function(a){
            var i = a.length, 
                r = /%25/g,  // Ensure '%' is properly represented 
                h = {};      // (Safari auto-encodes '%', Firefox 1.5 does not)
            while(i--) {
                var p = a[i].split('=');
                h[ p[0] ] = r.test( p[1] ) ? decodeURIComponent( p[1] ) : p[1];
            }
            return h;
        }(window.location.search.substr(1).split('&'))
});

Ví dụ sử dụng:

switch ($.Q.event) {
    case 'new' :
        // http://www.site.com/?event=new
        $('#NewItemButton').trigger('click');
        break;
    default :
}

Hi vọng điêu nay co ich. ;)



1

Nếu $ _GET của bạn đa chiều, đây có thể là thứ bạn muốn:

var $_GET = {};
document.location.search.replace(/\??(?:([^=]+)=([^&]*)&?)/g, function () {
    function decode(s) {
            return decodeURIComponent(s.split("+").join(" "));
    }

    //handling for multidimensional arrays
    if(decode(arguments[1]).indexOf("[]") > 0){
        var newName = decode(arguments[1]).substring(0, decode(arguments[1]).length - 2);
        if(typeof $_GET[newName] == 'undefined'){
            $_GET[newName] = new Array();
        }
        $_GET[newName].push(decode(arguments[2]));
    }else{
        $_GET[decode(arguments[1])] = decode(arguments[2]);
    }
});

1

đơn giản, nhưng hữu ích để nhận vars / giá trị từ URL:

function getUrlVars() {
    var vars = [], hash, hashes = null;
    if (window.location.href.indexOf("?") && window.location.href.indexOf("&")) {
        hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    } else if (window.location.href.indexOf("?")) {
        hashes = window.location.href.slice(window.location.href.indexOf('?') + 1);
    }
    if (hashes != null) {
        for (var i = 0; i < hashes.length; i++) {
            hash = hashes[i].split('=');
            vars[hash[0]] = hash[1];
        }
    }
    return vars;
}

Tôi đã tìm thấy nó ở đâu đó trên internet, chỉ sửa một số lỗi


1

Sử dụng chức năng sau:

var splitUrl = function() {
    var vars = [], hash;
    var url = document.URL.split('?')[0];
    var p = document.URL.split('?')[1];
    if(p != undefined){
        p = p.split('&');
        for(var i = 0; i < p.length; i++){
            hash = p[i].split('=');
            vars.push(hash[1]);
            vars[hash[0]] = hash[1];
        }
    }
    vars['url'] = url;
    return vars;
};

và truy cập các biến như vars['index']nơi 'index'là tên của biến get.


Mã này không thành công đối với các UTL như http://foo.com/?a=b#bar. Nó nghĩ b#barlà giá trị cho a.
MM

1

Đơn giản

thay VARIABLE_KEY bằng khóa của biến để nhận giá trị của nó

 var get_value = window.location.href.match(/(?<=VARIABLE_KEY=)(.*?)[^&]+/)[0]; 

0

Chỉ để ghi lại, tôi muốn biết câu trả lời cho câu hỏi này, vì vậy tôi đã sử dụng một phương thức PHP:

<script>
var jGets = new Array ();
<?
if(isset($_GET)) {
    foreach($_GET as $key => $val)
        echo "jGets[\"$key\"]=\"$val\";\n";
}
?>
</script>

Bằng cách đó, tất cả javascript / jquery của tôi chạy sau nó có thể truy cập mọi thứ trong jGets. Đó là một giải pháp thanh lịch tốt đẹp tôi cảm thấy.


0

Cách tiếp cận của tôi:

var urlParams;
(window.onpopstate = function () {
var match,
      pl     = /\+/g,  Regex for replacing addition symbol with a space
       search = /([^&=]+)=?([^&]*)/g,
      decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
       query  = window.location.search.substring(1);
   urlParams = {};
   while (match = search.exec(query))
    urlParams[decode(match[1])] = decode(match[2]);
})();
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.