2012-01-20 11 views
6

Mam menu rozwijane, które pełniło podwójną rolę. Użytkownik może przejść bezpośrednio do strony (http://mysite/events/Pages/default.aspx) i skorzystać z menu rozwijanego lub najpierw przeprowadzić wyszukiwanie, a następnie filtrować wyniki wyszukiwania, wybierając menu rozwijane. Pierwszy przypadek URL będzie jak http://mysite/events/Pages/default.aspx?hos=Carmel i drugim przypadku URL http://mysite/events/Pages/default.aspx?kwd=health&type=Events&hos=Carmel To, co robię teraz, ale zachowuje się dziwnie i robi czegoś takiego do adresu http://mysite.events/Pages/default.aspx?hos=Crown&hos=CarmelZastąp wartość kwerendy adresu URL przy zmianie listy rozwijanej

Więc jeśli wybrany użytkownik karmel z rozwijalnej pierwszy raz i zdecydował, że chce poszukać Indianapolis, wtedy powinien albo zastąpić "Carmel" przez Indianapolis, albo zastąpić całe querstring "& hos = Carmel" z "& hos = Indianapolis" dla drugiego przypadku i "? hos = Carmel "z"? Hos = Indianapolis "dla pierwszego scenariusza

$(".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(); } 
    )}; 

Znalazłem fajny kod, który używa wyrażenia regularnego do obsługi kwerendy, ale nie rozumiem, jak działa regex. Jak mogę użyć czegoś takiego jak poniżej w moim przypadku?

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; 
} 

Odpowiedz

7

Trzeba zrobić coś takiego:

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 snippet znaleźliście już pakuje się w schludny mały funkcji dla ciebie, więc nie trzeba nic wiedzieć na temat regex używać tego. Wszystko, co musisz zrobić, to przekazać tej funkcji adres URL, parametr, który próbujesz zmienić ("hos") i nową wartość.

Również, $(location).attr('href') nie jest tak naprawdę ważny, a ty i tak go nie używałeś, więc po prostu wyjmij go i trzymaj przy pomocy window.location.href.

Wreszcie, chociaż w tym konkretnym przypadku nie potrzebowałeś żadnej wiedzy o reggerze, możesz zdecydowanie skorzystać z nauki co najmniej kilku podstawowych składni regex. Spójrz na http://www.regular-expressions.info/, aby uzyskać dobre wyjaśnienia, a następnie użyj testera regex, takiego jak http://www.regextester.com/, aby bawić się z próbkami i spróbować napisać własne.

+0

Overlooked rzeczywiście odpowiedział na pytanie - być może warto przenieść swoją odpowiedź się przed wyjaśnieniem – mplungjan

+0

@mplungjan dobry punkt. Poprawiono moją odpowiedź, sugerując: –

+0

Sugeruję także zmianę window.location ponieważ window.location.href jest reprezentacją ciągów bieżącego adresu URL - dlatego zmień the.href, ale ustaw obiekt lokalizacji – mplungjan

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