2012-01-20 62 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); 
});