2012-12-06 12 views
5

Mam następujący link:wykonać href przed onClick

<a href="#HDR" onClick="showGallery()">I</a> 

i to należy stosować następujące javascript:

function showGallery(){ 
    if(window.location.hash) { 
     $('#gallery').fadeIn('fast'); 
     var hash = window.location.hash.substring(1); 
     alert(hash); 
    } else { 

    } 

} 

Więc to tylko pokazać galerię gdy w adresie URL jest hashtag. Ale kiedy kliknę link, nic się nie dzieje. Kiedy kliknę dwa razy, galeria znika.

Więc link najpierw tworzy javascript, a ja nie działa, bo nie ma hashtag w adresie URL, a potem wykonuje href i wstawia Hashtag w adresie URL. Jak mogę to zrobić?

Moja docelowa:

po kliknięciu na link, otworzy galerię. Aby dowiedzieć się, którą galerię muszę otworzyć, wstawiam w adresie URL hasztag. Tutaj chcę wyświetlić album HDR. I ja też chcę, jeśli moja strona będzie dostępna z hashtagiem, powinna wyświetlić galerię.!

Czy istnieje inny, łatwiejszy lub czystszy sposób, aby to zrobić? Mam nadzieję, że rozumiesz, czego chcę.

Odpowiedz

4

Dla nowoczesnych przeglądarkach, można powiązać swój kod JavaScript, żeby w razie onhashchange. Linki będą bez Javascript:

<a href="#HDR">I</a> 

A Javascript jest uruchamiany, gdy hash zmieniła:

function locationHashChanged() { 
    if (location.hash === "#HDR") { 
     $('#gallery').fadeIn('fast'); 
    } 
} 

window.onhashchange = locationHashChanged; 
+0

Nice! To jest "elegancka" metoda :) Dziękuję +1 i akceptuję;) Ale co to jest window.onhashchange = locationHashChanged; oznaczać? –

+2

Dodaje obsługę zdarzeń, dzięki czemu funkcja 'locationHashChanged' jest wywoływana za każdym razem, gdy zostanie wywołane zdarzenie' hashchange' w oknie. W jQuery będzie to '$ (window) .bind ('hashchange', locationHashChanged)'. – Sjoerd

1

Czy próbowałeś wywołania setTimeout, aby opóźnić zdarzenie onclick?

Jak to:

<a href="#HDR" onClick="setTimeout(function(){showGallery.call(this)},20)">I</a> 
+0

Cool! To działa! Ale czy nie jest to trochę brzydkie? Ale +1! –

+0

Cholernie brzydko .. ale w mojej sytuacji to jedyny możliwy sposób. Dah! –

1

Można uprościć to dość znacznie, to nie jest dobra praktyka, aby skorzystać z href dla innych rzeczy niż czysta nawigacja.

<a onClick="showGallery('HDR')">I</a> 

A potem:

function showGallery(name){ 
    if(name) { 
     $('#gallery').fadeIn('fast'); 
     alert(name); 
    } else { 

    } 
} 
+0

Próbowałem również to. Ale wtedy galeria otwiera tylko ten link. Chcę też pokazać go, jeśli #HDR w adresie URL i aktualizuję witrynę. np. z CTRL + R –

+1

Ahh ok, to powinieneś pójść z odpowiedzią Sjoerd'a poniżej, ale możesz chcieć trochę więcej przeczytać na temat skrótu, a także na temat obsługiwanych przeglądarek. –

0

Jeśli chcesz uruchomić showGallery() bez następujący link, poprawny kod to:

<a href="#HDR" onClick="showGallery(); return false;">I</a> 

Utrzymując href użytkownik nadal widzi miejsce docelowe na pasku stanu, a nawigacja wciąż działa dla klientów bez Javascript (np. Google). Zwracając wartość false w procedurze obsługi zdarzeń, uniemożliwisz przeglądarce śledzenie linku.

W showGallery() można następnie wyświetlić galerię i dodać "#HDR" do location.hash.

+0

To powinno uruchomić galerię. Teraz nic nie robi ... –

0

Nie trzeba weryfikować hasha okna, ponieważ po pierwszym kliknięciu nie ma żadnego skrótu w pasku adresu. Funkcjonalność będzie obowiązywała tylko przy drugim kliknięciu.

Co można zrobić to w ten sposób:

<a href="#HDR" id="g1" onClick="showGallery('g1')">gallery 1</a>

function showGallery(galid){ 
    var linkhash = $('#' + galid).attr('href').substring(1); 

    alert(linkhash); 

    $('#gallery' + linkhash).fadeIn('fast'); 
}