2011-08-01 39 views
12

URL hiện tại của tôi là: http://something.com/mobiles.php?brand=samsungLàm cách nào để thêm thông số vào URL?

Bây giờ khi người dùng nhấp vào một bộ lọc giá tối thiểu (nói 300), tôi muốn URL của tôi để trở thành

http://something.com/mobiles.php?brand=samsung&priceMin=300

Nói cách khác, tôi đang tìm kiếm một hàm javascript sẽ thêm thông số được chỉ định trong URL hiện tại và sau đó chuyển hướng lại trang web đến URL mới.

Lưu ý: Nếu không có tham số được thiết lập sau đó chức năng nên thêm ? thay vì &

tức là nếu URL hiện tại là http://something.com/mobiles.php sau đó trang nên được tái định hướng để http://something.com/mobiles.php?priceMin=300 thay vì http://something.com/mobiles.php&priceMin=300

+1

Bất kỳ lý do bạn không thể tạo ra các liên kết server-side hoặc sử dụng một hình thức web? – zzzzBov

+0

Tôi đồng ý với @zzzzBov, sau đó bạn có thể biến bộ lọc giá tối thiểu của mình thành liên kết động. – iLLin

+1

Có quá nhiều bộ lọc trên trang web của tôi như tên thương hiệu, phạm vi giá, sắp xếp theo mức độ phổ biến, sắp xếp theo giá và nhiều loại khác. Để tạo ra URL trên phía máy chủ cần rất nhiều câu lệnh 'if-else' và sẽ tạo ra các tải không cần thiết trên máy chủ. Tôi đặc biệt đang tìm kiếm thay đổi URL ở phía khách hàng. Cảm ơn! –

Trả lời

16

thử một cái gì đó như thế này, nó nên cân nhắc cũng có trường hợp khi bạn đã có param trong url:

function addOrUpdateUrlParam(name, value) 
{ 
    var href = window.location.href; 
    var regex = new RegExp("[&\\?]" + name + "="); 
    if(regex.test(href)) 
    { 
    regex = new RegExp("([&\\?])" + name + "=\\d+"); 
    window.location.href = href.replace(regex, "$1" + name + "=" + value); 
    } 
    else 
    { 
    if(href.indexOf("?") > -1) 
     window.location.href = href + "&" + name + "=" + value; 
    else 
     window.location.href = href + "?" + name + "=" + value; 
    } 
} 

sau đó bạn gọi nó như thế nào trong trường hợp của bạn:

addOrUpdateUrlParam('priceMin', 300); 
+0

Nếu tham số được gọi là 'mypriceMin' đã là một phần của location.href, nó có thể bị thay đổi, vì vậy hãy cẩn thận mã thực sự hoạt động vì mục đích của nó. Ngoài ra, regex chỉ nên chạy trên phần tìm kiếm chứ không phải toàn bộ href. – hakre

+0

@hakre cố định "mypriceMin" vấn đề :) như cho phần tìm kiếm chỉ - có nó sẽ có hiệu quả hơn trên chuỗi ngắn hơn, tất nhiên đây không phải là giải pháp tối ưu, bất cứ ai có thể tinh chỉnh nó theo ý thích của mình – petho

+0

Thêm một chức năng dưới đây sẽ thực sự so sánh tên tham số chuẩn hóa, tham số của bộ đã tồn tại và không có giá trị và loại bỏ các tham số trùng lặp. Và nó chỉ hoạt động trên tìm kiếm, không cần phải xử lý phần còn lại của URI. – hakre

4
if(location.search === "") { 
    location.href = location.href + "?priceMin=300"; 
} else { 
    location.href = location.href + "&priceMin=300"; 
} 

Trong trường hợp location.search === "", thì không có ? một phần.

Vì vậy, hãy thêm ?newpart để nó trở thành .php?newpart.

Nếu không, có một phần ?.

Vì vậy, hãy thêm &newpart để nó trở thành .php?existingpart&newpart.


Nhờ hakre, bạn cũng có thể chỉ cần đặt nó thích:

location.search += "&newpart"; 

Nó sẽ tự động thêm ? nếu cần thiết (nếu không muốn nói rõ ràng, nó sẽ làm cho nó ?&newpart theo cách này, nhưng điều đó không nên vấn đề).

+0

Không cần 'if' trong ví dụ của bạn, điều tương tự cũng có thể được thực hiện bởi 'location.search + =" & priceMin = 300 ";' chỉ. – hakre

+0

@hakre: Tôi xin lỗi nhưng 'if' là có để phân biệt giữa'? 'Và' & '. – pimvdb

+1

Đó là thừa như bạn có thể sử dụng 'tìm kiếm' mà không cần phải thiết lập'? 'Nếu nó không phải là một phần của nó. Với mã của bạn, bạn thậm chí sẽ thêm nó sau phần băm ở cuối như tôi thấy, thử với 'test.html? A = b # filter'. – hakre

0

Nếu bạn đang yêu cầu người dùng điền vào trường văn bản với giá tối thiểu, tại sao không để biểu mẫu gửi dưới dạng yêu cầu GET với một hành động trống? IIRC, mà nên làm những gì bạn muốn, mà không có bất kỳ javascript.

0

sử dụng var urlString = window.location để có được url

kiểm tra nếu url đã có chứa một '?' với urlString.indexOf('?'), -1 có nghĩa là nó không tồn tại.

đặt window.location để chuyển hướng

điều này giống như 101 của javascript. thử một số công cụ tìm kiếm!

0
<FORM action="" method="get"> 
<P> 
<LABEL for="brand">Brand: </LABEL> 
      <INPUT type="text" id="brand"><BR> 
<LABEL for="priceMin">Minimum Price: </LABEL> 
      <INPUT type="text" id="priceMin"><BR> 
</P> 

1
var applyMinPrice = function(minPrice) { 
    var existingParams = (location.href.indexOf('?') !== -1), 
     separator = existingParams ? '&' : '?', 
     newParams = separator + 'priceMin=' + minPrice; 

    location.href += newParams; 
} 
13

Thực ra đây là hoàn toàn tầm thường, bởi vì đối tượng vị trí javascript đã giao dịch với điều này. Chỉ cần đóng gói này một lót vào một chức năng để tái sử dụng nó với các liên kết vv:

<script> 
    function addParam(v) { 
     window.location.search += '&' + v; 
    } 
</script> 

<a href="javascript:addParam('priceMin=300');">add priceMin=300</a> 

Không cần để kiểm tra ? như thế này đã là phần search và bạn chỉ cần thêm param.

Nếu bạn không muốn thậm chí tận dụng một chức năng bạn có thể viết như vậy:

<a href="javascript:location.search+='&priceMin=300';">add priceMin=300</a> 

Hãy ghi nhớ rằng đây thực hiện chính xác những gì bạn đã yêu cầu: Để thêm rằng tham số cụ thể. Nó có thể là một phần của phần search vì bạn có thể có cùng một thông số nhiều lần trong một URI. Bạn có thể muốn bình thường hóa trong ứng dụng của mình, nhưng đó là một trường khác. Tôi sẽ tập trung hóa việc bình thường hóa URL thành một chức năng của chính nó.

Edit:

Trong cuộc thảo luận về các câu trả lời được chấp nhận ở trên nó trở nên rõ ràng, rằng các điều kiện sau đây cần được đáp ứng để có được một hàm làm việc:

  • nếu tham số đã tồn tại thì nên bị thay đổi.
  • nếu thông số đã tồn tại nhiều lần, chỉ bản sao đã thay đổi mới có thể tồn tại.
  • nếu thông số đã tồn tại, nhưng không có giá trị, giá trị phải được đặt.

Như search đã cung cấp các chuỗi tìm kiếm, điều duy nhất còn lại để đạt được là để phân tích một phần truy vấn-info vào tên và giá trị cặp, thay đổi hoặc thêm tên mất tích và giá trị và sau đó thêm nó trở lại search :

<script> 
    function setParam(name, value) { 
     var l = window.location; 

     /* build params */ 
     var params = {};   
     var x = /(?:\??)([^=&?]+)=?([^&?]*)/g;   
     var s = l.search; 
     for(var r = x.exec(s); r; r = x.exec(s)) 
     { 
      r[1] = decodeURIComponent(r[1]); 
      if (!r[2]) r[2] = '%%'; 
      params[r[1]] = r[2]; 
     } 

     /* set param */ 
     params[name] = encodeURIComponent(value); 

     /* build search */ 
     var search = []; 
     for(var i in params) 
     { 
      var p = encodeURIComponent(i); 
      var v = params[i]; 
      if (v != '%%') p += '=' + v; 
      search.push(p); 
     } 
     search = search.join('&'); 

     /* execute search */ 
     l.search = search; 
    } 
</script> 

<a href="javascript:setParam('priceMin', 300);">add priceMin=300</a> 

này ít nhất là một chút mạnh mẽ hơn vì nó có thể đối phó với URL như thế này:

test.html?a?b&c&test=foo&priceMin=300 

Hoặc thậm chí:

test.html?a?b&c&test=foo&pri%63eMin=300 

Ngoài ra, tên và giá trị được thêm vào luôn được mã hóa chính xác. Trường hợp này có thể thất bại là nếu một tên tham số dẫn đến một nhãn thuộc tính js bất hợp pháp.

+0

Cảm ơn, hàm setParam này thực sự hữu ích. Có cách nào tôi có thể gọi nó nhiều hơn một lần để thiết lập nhiều thông số? – Alex

+0

cảm ơn hoạt động hoàn hảo! – sputn1k

0
<html> 
<body> 
.. 
.. 
.. 

<?php 
$priceMinValue= addslashes ($_GET['priceMin']); 
if (!empty($priceMin)) { 
     $link = "currentpage.php?priceMin=". $priceMinValue; 
     die("<script>location.href = '".$link. "'</script>");  
} 
?> 
</body> 
</html> 
+0

anh ta muốn một phía khách hàng javascript, không phải phía máy chủ – JaMaBing

2

Tôi viết lại đúng câu trả lời trong PHP:

function addOrUpdateUrlParam($name, $value){ 
$href = $_SERVER['REQUEST_URI']; 
$regex = '/[&\\?]' . $name . "=/"; 
if(preg_match($regex, $href)){ 
    $regex = '([&\\?])'.$name.'=\\d+'; 
    $link = preg_replace($regex, "$1" . $name . "=" . $value, $href); 
}else{ 
    if(strpos($href, '?')!=false){ 
     $link = $href . "&" . $name . "=" . $value; 
    }else{ 
     $link = $href . "?" . $name . "=" . $value; 
    } 
} 
return $link; 
} 

Tôi hy vọng sự giúp đỡ của ai đó ...

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