2012-01-20 59 views
6

我有一個雙重角色的下拉列表。用戶可以直接進入頁面(http://mysite/events/Pages/default.aspx)並使用下拉菜單,或者他們可以首先執行搜索,並通過選擇下拉菜單進一步搜索搜索結果。 第一案URL會像 http://mysite/events/Pages/default.aspx?hos=Carmel和 第二種情況URL http://mysite/events/Pages/default.aspx?kwd=health&type=Events&hos=Carmel 這就是我現在在做什麼,但它的行爲怪異,並做某事像這樣以URL http://mysite.events/Pages/default.aspx?hos=Crown&hos=Carmel更換下拉列表時替換URL查詢字符串值

所以,如果從下拉菜單中用戶選擇卡梅爾的第一次,並決定他/她想尋找印第安納波利斯,那麼它應該或者用印第安納波利斯代替'卡梅爾',或者替換第二個案例中的「hos = Carmel」和「& hos = Indianapolis」的整個querstring,並且「?hos =卡梅爾「與」?hos =印第安納波利斯「的第一個場景

$(".hospitalDropDown").change(function(e){ 
      var querystring=window.location.search; 
      var currentURL=$(location).attr('href'); 
      if(location.href.indexOf('?') == -1) { 
       window.location.href= 'http://mysite/events/Pages/default.aspx'+'?hos='+$(this).val(); 
       } 
       else{ 

        window.location.href = ($(this).val() == "All Hospitals") ? 'http://mysitesite/events/Pages/default.aspx': location.href +'&hos='+ $(this).val(); } 
    )}; 

我發現了一些漂亮的代碼,使用正則表達式來處理查詢字符串,但我不明白正則表達式如何工作..如何在我的情況下使用下面的樣子?

function replaceQueryString(url,param,value) { 
    var re = new RegExp("([?|&])" + param + "=.*?(&|$)","i"); 
    if (url.match(re)) 
     return url.replace(re,'$1' + param + "=" + value + '$2'); 
    else 
     return url + '&' + param + "=" + value; 
} 

回答

7

你需要做這樣的事情:

function replaceQueryString(url,param,value) { 
    var re = new RegExp("([?|&])" + param + "=.*?(&|$)","i"); 
    if (url.match(re)) 
     return url.replace(re,'$1' + param + "=" + value + '$2'); 
    else 
     return url + '&' + param + "=" + value; 
} 

$(".hospitalDropDown").change(function(e) { 
    window.location.href = replaceQueryString(window.location.href, 'hos', $(this).val()); 
)}; 

replaceQueryString段,您發現您一個整潔的小功能已經被打包,所以你不需要了解任何正則表達式使用它。你所需要做的就是傳遞你的url,你試圖改變的參數(「hos」)和新值。

此外,$(location).attr('href')是不是真的有效,並且你還沒有使用它,所以只要拿出來並堅持window.location.href

最後,雖然在這種特殊情況下您不需要任何正則表達式知識,但您肯定可以從學習至少一些基本的正則表達式語法中受益。看看http://www.regular-expressions.info/以得到一些很好的解釋,然後使用像http://www.regextester.com/這樣的正則表達式測試器來玩弄樣本並嘗試寫一些自己的樣本。

+0

忽視了你實際上回答了這個問題 - 也許你應該把你的答案放在前面的解釋 – mplungjan

+0

@mplungjan好點。按照你的建議重新排列我的答案 –

+0

另外我建議改變window.location,因爲window.location.href是當前url的字符串表示 - 所以改變the.href但設置位置對象 – mplungjan

0
$(".hospitalDropDown").change(function(e){ 
    var newhos=($(this).val() == "All Hospitals") ? '' : '$1hos=' + $(this).val(); 
    location.href=location.href.replace(/([\?\&])hos=\w+/,newhos); 
});