2008-09-30 8 views
17

Zajmuję się stroną internetową w pracy i ostatnio dodałem żądania ajaxy, aby była szybsza i bardziej responsywna. Ale to podniosło problem.Środkowe kliknięcie (nowe zakładki) i linki do javascript

Na moich stronach po lewej stronie znajduje się tabela indeksów, podobnie jak menu. Po kliknięciu wywołuje on żądanie, które wypełnia resztę strony. W dowolnym momencie możesz kliknąć inną pozycję indeksu, aby załadować inną stronę.

Przed dodaniem javascript, możliwe było kliknięcie środkowe (otwieranie nowych kart) dla każdej pozycji indeksu, co pozwoliło na załadowanie innych stron, gdy miałem do czynienia z jednym z nich. Ale odkąd zmieniłem wszystkie łącza, które mają być żądaniami ajax, teraz wykonują trochę javascript zamiast być prawdziwymi linkami. Dlatego otwierają tylko puste karty, gdy kliknę je środkowym przyciskiem myszy.

Czy istnieje sposób połączenia obu funkcji: linki uruchamiające javascript po kliknięciu lewym przyciskiem lub nowe karty po kliknięciu środkowym? Czy to musi być jakiś brzydki javascript, który przechwytuje każde kliknięcie i odpowiednio sobie z nim radzi?

Dzięki.

Odpowiedz

0

Możliwe, że mógłbym podać dwa linki za każdym razem, jeden uruchamiający javascript i inny będący rzeczywistym łączem, który pozwoliłby na średnie kliknięcie. Przypuszczam, że jeden z nich musiałby być obrazem, aby uniknąć przeciążenia indeksu.

1

Wymagałoby to pewnych testów, ale uważam, że większość przeglądarek nie wykonuje obsługi kliknięć po ich kliknięciu, co oznacza, że ​​wykorzystywany jest tylko link.

Jednak funkcja handlowa nie musi zwracać wartości false, aby zapewnić, że te linki nie będą używane, gdy normalnie klikniesz.

EDIT: Felt to może posłużyć się przykładem:

<a href="/Whatever/Wherever.htm" onclick="handler(); return false;" /> 
21

Tak. Zamiast:

<a href="javascript:code">...</a> 

Wykonaj:

<a href="/non/ajax/display/page" id="thisLink">...</a> 

a potem w swoim JS, hak odnośnik poprzez to ID zrobić wywołanie AJAX. Pamiętaj, że musisz powstrzymać wydarzenie klikania od bulgotania. W większości frameworków wbudowany jest event killer, który można wywołać (wystarczy spojrzeć na jego klasę Event).

Oto obsługi zdarzeń i zdarzeń zabójca w jQuery:

$("#thisLink").click(function(ev, ob) { 
    alert("thisLink was clicked"); 
    ev.stopPropagation(); 
}); 

Oczywiście można być dużo bardziej inteligentne, podczas żonglerki takie rzeczy, ale myślę, że ważne jest, aby podkreślić, że metoda ta jest tak znacznie czystsze niż atrybuty onclick.

Zachowaj swój JS w JS!

+1

Jedyny "problem" z tym podejściem polega na tym, że osoba przeglądająca znaczniki nie będzie mogła od razu zobaczyć, że istnieje powiązana procedura obsługi zdarzeń. – Rob

+1

Nie klasyfikuję tego problemu. Jeśli konstruujesz elementy w znaczący sposób, powinieneś móc spojrzeć na JS, zobaczyć, gdzie są wszystkie haki zdarzeń. Jeśli martwisz się tym zbyt mocno, możesz * ustawić * wartość rel attr na js, lub wpisać ID z js_, itp. – Oli

+1

Lub alternatywnie możesz użyć atrybutu "onclick" zgodnie z przeznaczeniem i umieścić nazwę funkcja obsługi zdarzeń tam. Zmiana przeznaczenia atrybutu "rel" lub poprzedzanie identyfikatorem js_ naprawdę "pachnie źle", gdy istnieje atrybut zdefiniowany wyraźnie w tym celu. – Rob

0

Zdarzenie onclick nie zostanie uruchomione dla tego typu kliknięcia, więc musisz dodać atrybut href, który faktycznie działałby. Można to zrobić, dodając do adresu URL adres #bookmark, aby wskazać stronie docelowej, jaki jest wymagany stan.

+1

Jednak powoduje to scuzz up znaczników. Głosowałbym za nadaniem id i pozostawieniem JS w JS, gdzie należy każdy dzień tygodnia. – Oli

3

Tak, musisz sprawdzić stopniowe ulepszanie i dyskretną obsługę Javascript, a następnie zakodować witrynę, aby działała bez włączonej obsługi JavaScript, a następnie dodać funkcje Javascript po uruchomieniu podstawowej witryny.

1
<a href="/original/url" onclick="return !doSomething();">link text</a> 

Aby uzyskać więcej informacji i zapoznać się ze szczegółowymi wyjaśnieniami zobacz my answer in another post.

3

Podobało mi się podejście Oli, ale nie odróżniało się od lewego i środkowego kliknięcia. sprawdzanie pola "which" na eventArgs powiadomi Cię o tym.

$(".detailLink").click(function (ev, ob) { 
    //ev.which == 1 == left 
    //ev.which == 2 == middle 
    if (ev.which == 1) { 
     //do ajaxy stuff 

     return false; //tells browser to stop processing the event 
    } 
    //else just let it go on its merry way and open the new tab. 
}); 
Powiązane problemy