2012-01-05 12 views
17

Tôi muốn có một nút trứng Phục sinh nhỏ ở góc của một trang dự án. Khi được nhấp, nó chỉ thả một chuỗi vào url hiện tại và tải lại trang.Nối một thông số vào URL hiện tại

Vì vậy, nếu tôi đang trên: http://test.com/projects/view/134

Nút được nhấp

trang tải lại trên: http://test.com/projects/view/134?ts=true

Không thực sự chắc chắn làm thế nào tôi có thể đi về làm như vậy mặc dù.

+2

séc ra @ChamikaSandamal cho câu trả lời đúng – Eliezer

Trả lời

20

Bạn có thể gán location.href với giá trị nó hiện có, cộng với chuỗi truy vấn mới của bạn:

(chỉnh sửa để có thân thiện với querystrings hiện)

$("#yourButtonId").click({ 
    var loc = location.href; 
    if (loc.indexOf("?") === -1) 
     loc += "?"; 
    else 
     loc += "&"; 
    location.href = loc + "ts=true"; 
}); 

Hoặc để được gọn gàng hơn:

$("#yourButtonId").click({ 
    var loc = location.href;   
    loc += loc.indexOf("?") === -1 ? "?" : "&"; 

    location.href = loc + "ts=true"; 
}); 
+2

gì nếu đã có các tham số vào cuối url? – Eliezer

+0

@Eliezer - điểm tốt, cảm ơn bạn –

+0

bạn đang sao chép câu trả lời của tôi: P http://stackoverflow.com/a/8737675/880434 –

2

Bạn có nghĩa là:

 

$(document).ready(function() { 
    $("#yourButtonId").click(function() { 
     var currentUrl = window.location.pathname + "?ts=true"; 
    }); 
}); 

 
3
location.href += '?ts=true'; 

Giống như vậy.

+0

Tạo một vòng lặp vô hạn – geotheory

23

thử mã này,

var separator = (window.location.href.indexOf("?")===-1)?"?":"&"; 
window.location.href = window.location.href + separator + "ts=true"; 

CHỈNH SỬA: để tránh tham số trùng lặp hoặc chuỗi rất lớn trong url của bạn, bạn cần phải thay thế các param cũ nó đã tồn tại.

var url=window.location.href, 
    separator = (url.indexOf("?")===-1)?"?":"&", 
    newParam=separator + "ts=true"; 
    newUrl=url.replace(newParam,""); 
    newUrl+=newParam; 
    window.location.href =newUrl; 
+0

Vâng +1 kể từ khi bạn đã có nó đầu tiên (và tôi hứa với bạn tôi đã không sao chép) :-) –

+0

@AdamRackis: tôi không nhớ nó là một bản sao hay không. :) –

+0

nhưng nếu URL chứa băm thì sao? – fabiangebert

2

Nếu bạn muốn chiếm sự tồn tại tiềm năng của một băm "#" trong URL, tiến hành như sau:

var href = location.href; 
var hasQuery = href.indexOf("?") + 1; 
var hasHash = href.indexOf("#") + 1; 
var appendix = (hasQuery ? "&" : "?") + "ts=true"; 
location.href = hasHash ? href.replace("#", appendix + "#") : href + appendix; 
3

Tôi tìm thấy câu trả lời trước thiếu và như vậy đây là một phương pháp xử lý tốt hơn các tham số khác trong chuỗi truy vấn hiện tại

appendToQueryString = function (param, val) { 
    var queryString = window.location.search.replace("?", ""); 
    var parameterListRaw = queryString == "" ? [] : queryString.split("&"); 
    var parameterList = {}; 
    for (var i = 0; i < parameterListRaw.length; i++) { 
     var parameter = parameterListRaw[i].split("="); 
     parameterList[parameter[0]] = parameter[1]; 
    } 
    parameterList[param] = val; 

    var newQueryString = "?"; 
    for (var item in parameterList) { 
     if (parameterList.hasOwnProperty(item)) { 
      newQueryString += item + "=" + parameterList[item] + "&"; 
     } 
    } 
    newQueryString = newQueryString.replace(/&$/, ""); 
    return location.origin + location.pathname + newQueryString; 
} 

Bạn phải sử dụng location.href = appendToQueryString(ts, true) để tải lại trang thực sự.

+0

Vì vậy, bạn tách toàn bộ chuỗi truy vấn, thêm một phần tử và đặt nó lại với nhau? Tại sao bạn làm điều đó thay vì chỉ chắp thêm thông số mới? –

+1

@HorstJahns để tránh các thông số đang được sao chép – Envil

0

Một cải tiến từ @Bobbzorzen câu trả lời, với khả năng xóa param bằng cách chỉ tên gọi của nó:

function AlterQueryString(param, val) { 
    var queryString = window.location.search.replace("?", ""); 
    var parameterListRaw = queryString == "" ? [] : queryString.split("&"); 
    var parameterList = {}; 
    for (var i = 0; i < parameterListRaw.length; i++) { 
     var parameter = parameterListRaw[i].split("="); 
     if (typeof val != 'undefined') { 
      parameterList[parameter[0]] = parameter[1]; 
     } else if (param != parameter[0]) { 
      parameterList[parameter[0]] = parameter[1]; 
     } 
    } 
    if (typeof val != 'undefined') { 
     parameterList[param] = val; 
    } 

    var newQueryString = Object.keys(parameterList).length > 0 ? "?" : ""; 
    for (var item in parameterList) { 
     if (parameterList.hasOwnProperty(item)) { 
      newQueryString += item + "=" + parameterList[item] + "&"; 
     } 
    } 
    newQueryString = newQueryString.replace(/&$/, ""); 
    return location.origin + location.pathname + newQueryString; 
} 

gist: https://gist.github.com/envil/bc1832503bef55ffdabb0cde32bb06f1

3

Hãy sử dụng đầy đủ các API location DOM, và đếm trong băm:

location.protocol + '//' + location.pathname + 
 
    (location.search ? location.search + '&a=b' : '?a=b') + 
 
    location.hash;

3

Sử dụng:

Ví dụ:

var url = new URL("http://foo.bar/?x=1&y=2"); 

// If your expected result is "http://foo.bar/?x=1&y=2&x=42" 
url.searchParams.append('x', 42); 

// If your expected result is "http://foo.bar/?x=42&y=2" 
url.searchParams.set('x', 42); 

// Build result 
url.toString(); 
+0

đáng buồn là chưa được hỗ trợ bởi tất cả các trình duyệt https://caniuse.com/#feat=urlsearchparams – Iftah