2010-03-29 34 views
110

Cách dễ dàng để xóa chuỗi truy vấn khỏi Đường dẫn trong Javascript là gì? Tôi đã thấy một plugin cho Jquery sử dụng window.location.search. Tôi không thể làm điều đó: URL trong trường hợp của tôi là một biến được đặt từ AJAX.Xóa chuỗi truy vấn khỏi URL

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3&SortOrder=dsc' 
+0

Bản sao có thể có của [Cách xóa băm từ window.location (URL) bằng JavaScript mà không cần làm mới trang?] (Https://stackoverflow.com/questions/1397329/how-to -remove-the-băm-từ-cửa sổ-vị trí-url-với-javascript-không-trang-r) – PayteR

Trả lời

272

Một cách dễ dàng để có được điều này là:

function getPathFromUrl(url) { 
    return url.split("?")[0]; 
} 

Đối với những người cũng muốn tháo băm (không nằm trong câu hỏi ban đầu) khi không có chuỗi truy vấn tồn tại, mà đòi hỏi một chút hơn:

function stripQueryStringAndHashFromPath(url) { 
    return url.split("?")[0].split("#")[0]; 
} 

EDIT

@caub (ban đầu @crl) gợi ý một combo đơn giản mà làm việc cho cả hai chuỗi truy vấn và băm (mặc dù nó sử dụng RegExp, trong trường hợp bất cứ ai có vấn đề với điều đó):

function getPathFromUrl(url) { 
    return url.split(/[?#]/)[0]; 
} 
+4

+1 ... Thực tế chia() tốt hơn chuỗi con() trong trường hợp này. –

+1

Tuy nhiên, tôi cũng phát hiện ra rằng phương thức substring() gần gấp đôi so với phương thức split(). (trong Firefox 3.6). –

+7

Tối ưu hóa biên nếu nó quan trọng (có thể không): 'split ('?', 1) [0]'. – bobince

31

Cập nhật 2: Trong nỗ lực để cung cấp một câu trả lời toàn diện, tôi benchmarking trong ba phương pháp được đề xuất trong các câu trả lời khác nhau.

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3'; 
var i; 

// Testing the substring method 
i = 0; 
console.time('10k substring'); 
while (i < 10000) { 
    testURL.substring(0, testURL.indexOf('?')); 
    i++; 
} 
console.timeEnd('10k substring'); 

// Testing the split method 
i = 0; 
console.time('10k split'); 
while (i < 10000) { 
    testURL.split('?')[0]; 
    i++; 
} 
console.timeEnd('10k split'); 

// Testing the RegEx method 
i = 0; 
var re = new RegExp("[^?]+"); 
console.time('10k regex'); 
while (i < 10000) { 
    testURL.match(re)[0]; 
    i++; 
} 
console.timeEnd('10k regex'); 

quả tìm kiếm trong Firefox 3.5.8 trên Mac OS X 10.6.2:

10k substring: 16ms 
10k split:  25ms 
10k regex:  44ms 

Kết quả trong Chrome 5.0.307.11 trên Mac OS X 10.6.2:

10k substring: 14ms 
10k split:  20ms 
10k regex:  15ms 

Note rằng phương thức chuỗi con kém hơn chức năng khi nó trả về một chuỗi trống nếu URL không chứa chuỗi truy vấn. Hai phương thức khác sẽ trả lại URL đầy đủ, như mong đợi. Tuy nhiên, thật thú vị khi lưu ý rằng phương thức chuỗi con là nhanh nhất, đặc biệt là trong Firefox.


1st UPDATE: Thực ra sự chia rẽ() phương pháp suggested by Robusto là một giải pháp tốt hơn mà một trong những Tôi đề nghị trước đó, vì nó sẽ làm việc ngay cả khi không có chuỗi truy vấn:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3'; 
testURL.split('?')[0]; // Returns: "/Products/List" 

var testURL2 = '/Products/List'; 
testURL2.split('?')[0]; // Returns: "/Products/List" 

Câu trả lời gốc:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3'; 
testURL.substring(0, testURL.indexOf('?')); // Returns: "/Products/List" 
+9

O_O Rất toàn diện thực sự, nhưng ... tại sao? Phương pháp linh hoạt và phù hợp nhất rõ ràng là thắng, tốc độ hoàn toàn không có mối quan tâm ở đây. – deceze

+1

@deceze: Chỉ vì sự tò mò ... Và bởi vì có một cuộc tranh luận về hiệu suất của phương pháp regex trong các bình luận của câu trả lời của Angus. –

+5

Rất thú vị, Daniel. Và nếu tôi phải thực hiện phân tích cú pháp URL 10K trên trang, tôi sẽ tìm một dòng công việc khác. :) – Robusto

2

Nếu bạn đang vào RegEx. ...

var newURL = testURL.match(new RegExp("[^?]+")) 
+1

regexp là chậm một - đi với cách nhanh chóng dễ dàng. – Aristos

+0

Không phải cho hoạt động này nó không phải là. 1000 ops trên một URL dài mất 5ms trong firefox – plodder

+1

@Angus: Vòng lặp của bạn đang cung cấp cho bạn "Tập lệnh có thể bận ..." vì bạn quên tăng 'a ++;'. Sửa các thử nghiệm, trong Firefox 3.6 của tôi trên iMac 2.93Ghz Core 2 Duo, tôi nhận được 8ms cho RegEx và 3ms cho phương thức tách ... Tuy nhiên, 1 cho câu trả lời, bởi vì nó vẫn là một tùy chọn khác. –

3

Một cách đơn giản là bạn có thể làm như sau

public static String stripQueryStringAndHashFromPath(String uri) { 
return uri.replaceAll(("(\\?.*|\\#.*)"), ""); 
} 
1
var path = "path/to/myfile.png?foo=bar#hash"; 

console.log(
    path.replace(/(\?.*)|(#.*)/g, "") 
); 
-1

Nếu sử dụng xương sống.js (trong đó có url anchor như tuyến đường), url query string thể xuất hiện:

  1. trước url anchor:

    var url = 'http://example.com?a=1&b=3#routepath/subpath'; 
    
  2. sau url anchor:

    var url = 'http://example.com#routepath/subpath?a=1&b=3'; 
    

Giải pháp:

012.
window.location.href.replace(window.location.search, ''); 
// run as: 'http://example.com#routepath/subpath?a=1&b=3'.replace('?a=1&b=3', ''); 
0

Đây có thể là câu hỏi cũ nhưng tôi đã thử phương pháp này để xóa thông số truy vấn. Dường như làm việc thuận lợi cho tôi khi tôi cần tải lại cũng như kết hợp với việc loại bỏ các tham số truy vấn.

window.location.href = window.location.origin + window.location.pathname; 

Cũng vì tôi đang sử dụng thao tác thêm chuỗi đơn giản, tôi đoán hiệu suất sẽ tốt. Nhưng vẫn đáng so sánh với các đoạn mã trong this answer

Các vấn đề liên quan