2010-10-11 19 views
155

Czy istnieje sposób użycia atrybutu html onclick do wywoływania więcej niż jednej funkcji JavaScript?Jak wywołać wiele funkcji JavaScript w zdarzeniu onclick?

+0

możliwy duplikat [Czy mogę mieć dwa zdarzenia onclick JavaScript w jednym elemencie?] (Http://stackoverflow.com/questions/2881307/can-i-have-two-javascript-onclick-events-in-one- element) –

Odpowiedz

276
onclick="doSomething();doSomethingElse();" 

Ale tak naprawdę, jesteś lepiej nie używając onclick w ogóle oraz załączeniem obsługi zdarzeń do węzła DOM poprzez kod JavaScript. Jest to znane jako unobtrusive javascript.

+1

Dzięki za odniesienie do dyskretnego JS, natknąłem się na to wcześniej, i powinienem powstrzymać się od pisania natrętnego JS tylko dlatego, że jestem leniwy! xD – Qcom

+6

żadnych problemów ... Bardzo polecam również jQuery, które naprawdę pomogą Ci w dyskretnym celu. Możesz łatwo dołączać programy do obsługi zdarzeń do elementów DOM i robić o wiele więcej bez żadnych przeszkód. Używam go od 2 lat i nigdy nie oglądałem się za siebie. – brad

+4

Jeśli jedna z akcji wywołanych w onclick zakończy się niepowodzeniem, cała sprawa przypada jak łańcuch domina i nie działa onclick. –

4

Oczywiście po prostu podłącz do niego wielu słuchaczy.

Short cutting with jQuery

$("#id").bind("click", function() { 
 
    alert("Event 1"); 
 
}); 
 
$(".foo").bind("click", function() { 
 
    alert("Foo class"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="foo" id="id">Click</div>

+3

nigdy nie wspomniano jQuery – hunter

+0

@hunter: Krótko pracowałem z jQuery. Nie pamiętam dokładnie natywnego kodu odbiornika zdarzeń.Możesz także zrobić to, o czym wspomina Marko, ale lepiej użyć detektora zdarzeń. –

+1

Może nie odpowiedział na oryginalne pytanie, ale ponieważ używam jQuery, odpowiedział na moje pytanie. –

57

Połączenie z 1 Funkcja określona

<a href="#" onclick="someFunc()">Click me To fire some functions</a> 

wypalania kilka funkcji z someFunc()

function someFunc() { 
    showAlert(); 
    validate(); 
    anotherFunction(); 
    YetAnotherFunction(); 
} 
+2

IMHO, to podejście prawdziwego programisty. –

+0

@ b1nary.atr0phy nope. sposób programisty polega na dodaniu atrybutu href = "", gdy użytkownik nie ma javascriptu. następnie za pomocą javascript (aby użytkownik go wspierał) usuwasz href i dodajesz detektory zdarzeń do zdarzenia. w ten sposób, jeśli inny moduł twojego kodu będzie nasłuchiwał tego samego kliknięcia, nie zostanie nadpisany ani nie zastąpi twojego kodu. przeczytaj: https://developer.mozilla.org/en-US/docs/Web/API/Event – gcb

+3

Może to nie działać dobrze, jeśli masz jakieś argumenty przekazywane do funkcji, szczególnie jeśli generujesz te argumenty z serwera język poboczny. Byłoby łatwiej budować/utrzymywać kod przez dołączanie funkcji (z dowolnymi argumentami) w języku po stronie serwera, zamiast testować wszystkie możliwe iteracje na serwerze i kliencie. – Siphon

9

byłoby użyć metody element.addEventListener połączyć go do funkcji. Z tej funkcji można wywołać wiele funkcji.

Zaletą jaką widzę przy wiązaniu zdarzenia do pojedynczej funkcji, a następnie wywołaniu wielu funkcji jest to, że można wykonać pewne sprawdzanie błędów, mieć pewne instrukcje if if else, aby niektóre funkcje były wywoływane tylko wtedy, gdy spełnione są określone kryteria.

26

Jest wymagany kod jeśli używasz tylko JavaScript i jQuery nie

var el = document.getElementById("id"); 
el.addEventListener("click", function(){alert("click1 triggered")}, false); 
el.addEventListener("click", function(){alert("click2 triggered")}, false); 
+6

to powinna być właściwa odpowiedź i właściwy sposób, jak to zrobić. – Fusion

0

Można skomponować wszystkie funkcje w jednym i nazywają them.Libraries jak Ramdajs posiada funkcję do komponowania wielu funkcji w jednym .

<a href="#" onclick="R.compose(fn1,fn2,fn3)()">Click me To fire some functions</a> 

lub można umieścić kompozycję jako funkcja oddzielnym w js pliku i nazwać

const newFunction = R.compose(fn1,fn2,fn3); 


<a href="#" onclick="newFunction()">Click me To fire some functions</a> 
+0

,, masz obsesję na punkcie ramdy. –

0

można dodać wiele tylko za pomocą kodu, nawet jeśli masz drugą onclick atribute w html robi się ignorowane, i click2 triggered nigdy nie zostanie wydrukowane, można dodać jeden na działanie mousedown, ale jest to tylko obejście.

Więc najlepiej zrobić to dodać je kodem jak w:

var element = document.getElementById("multiple_onclicks"); 
 
element.addEventListener("click", function(){console.log("click3 triggered")}, false); 
 
element.addEventListener("click", function(){console.log("click4 triggered")}, false);
<button id="multiple_onclicks" onclick='console.log("click1 triggered");' onclick='console.log("click2 triggered");' onmousedown='console.log("click mousedown triggered");' > Click me</button>

Trzeba dbać jak wydarzenia można mnożyć, a jeśli chcesz dodać wiele imprez ty może poluzować liczbę zleceń, które zostały uruchomione.

Powiązane problemy