Come chiamare più funzioni JavaScript nell'evento onclick?


Risposte:


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

Ma davvero, è meglio non usare onclickaffatto e collegare il gestore eventi al nodo DOM tramite il codice Javascript. Questo è noto come javascript discreto .


1
Grazie per il riferimento a JS discreto, l'ho già visto prima e dovrei astenermi dal scrivere JS invadente solo perché sono pigro! xD
Qcom,

9
no probs ... Consiglio vivamente anche jQuery che ti aiuterà davvero con il tuo obiettivo discreto. Puoi facilmente collegare i gestori di eventi agli elementi DOM e fare molto di più tutto in modo discreto. L'ho usato per 2 anni e non ho mai guardato indietro.
Brad

4
Se un'azione chiamata in onclick fallisce, l'intera cosa cade come una catena di domino e onclick non funziona.
Fiasco Labs,

8
Questo attributo html in realtà onclick=""non lo è onClick="". È un errore molto comune.
Estratto il

2
@ShubhamChopra di cosa stai parlando jsxnon lo è htmle questa domanda non è stata taggata conjsx
DrewT,

75

Un collegamento con 1 funzione definita

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

Attivazione di più funzioni da someFunc()

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

5
IMHO, questo è il vero approccio del programmatore.
b1nary.atr0phy,

2
@ b1nary.atr0phy no. il modo programmatore è quello di aggiungere un attributo href = "" per quando l'utente non ha javascript. quindi, con javascript (quindi sai che l'utente lo supporta) rimuovi l'href e aggiungi i listener di eventi all'evento. in questo modo, se un altro modulo del tuo codice ascolterà lo stesso clic, non verrà sovrascritto o sovrascriverà il tuo codice. leggi: developer.mozilla.org/en-US/docs/Web/API/Event
gcb

3
Questo potrebbe non funzionare bene se si hanno argomenti passati alle funzioni, specialmente se si generano tali argomenti da un linguaggio lato server. Sarebbe più semplice creare / mantenere il codice aggiungendo le funzioni (con qualsiasi argomento) all'interno del linguaggio lato server anziché testare tutte le possibili iterazioni sia sul server che sul client.
Sifone,

Questo è così bello ed elegante
Tessaracter il

38

Questo è il codice richiesto se si utilizza solo JavaScript e non jQuery

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

7
questa dovrebbe essere la risposta giusta e il modo giusto come farlo.
Fusion

11

Vorrei usare il element.addEventListener metodo per collegarlo a una funzione. Da quella funzione è possibile chiamare più funzioni.

Il vantaggio che vedo nel legare un evento a una singola funzione e quindi chiamare più funzioni è che puoi eseguire un controllo degli errori, avere alcune istruzioni if ​​else in modo che alcune funzioni vengano chiamate solo se vengono soddisfatti determinati criteri.


9

Certo, lega semplicemente più ascoltatori.

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>


@hunter: stavo tagliando corto con jQuery. Non ricordo esattamente il codice del listener di eventi nativo. Puoi anche fare ciò che Marko menziona, ma è meglio usare un listener di eventi.
Josh K,

1
Potrebbe non aver risposto alla domanda originale, ma poiché sto usando jQuery, ha risposto alla mia.
Fiasco Labs,

1
Un modo per farlo con il semplice Javascript vecchio?
CodyBugstein,

4

ES6 React

<MenuItem
  onClick={() => {
    this.props.toggleTheme();
    this.handleMenuClose();
  }}
>

2
@Questo è JSX, questa domanda non è etichettata sotto jsx
Shubham Chopra,

2

var btn = document.querySelector('#twofuns');
btn.addEventListener('click',method1);
btn.addEventListener('click',method2);
function method2(){
  console.log("Method 2");
}
function method1(){
  console.log("Method 1");
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Pramod Kharade-Javascript</title>
</head>
<body>
<button id="twofuns">Click Me!</button>
</body>
</html>

È possibile ottenere / chiamare un evento con uno o più metodi.


1

Puoi aggiungerne altri solo per codice anche se hai il secondo onclickattributo nell'html che viene ignorato e click2 triggerednon viene mai stampato, puoi aggiungerne uno in azionemousedown ma è solo una soluzione alternativa.

Quindi il meglio da fare è aggiungerli per codice come in:

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>

È necessario prestare attenzione poiché gli eventi possono accumularsi e, se si aggiungono molti eventi, è possibile perdere il conto dell'ordine in cui vengono eseguiti.


1

Un'aggiunta, per JavaScript gestibile, sta usando una funzione denominata.

Questo è l'esempio della funzione anonima:

var el = document.getElementById('id');

// example using an anonymous function (not recommended):
el.addEventListener('click', function() { alert('hello world'); });
el.addEventListener('click', function() { alert('another event') });

Ma immagina di averne un paio attaccati allo stesso elemento e vuoi rimuoverne uno. Non è possibile rimuovere una singola funzione anonima dal listener di eventi.

Invece, puoi usare le funzioni denominate:

var el = document.getElementById('id');

// create named functions:
function alertFirst() { alert('hello world'); };
function alertSecond() { alert('hello world'); };

// assign functions to the event listeners (recommended):
el.addEventListener('click', alertFirst);
el.addEventListener('click', alertSecond);

// then you could remove either one of the functions using:
el.removeEventListener('click', alertFirst);

Questo rende anche il tuo codice molto più facile da leggere e mantenere. Soprattutto se la tua funzione è più grande.


Per ulteriori informazioni, "tutorialist" Avelx ha un bel video che posso consigliare in merito a questo argomento: youtube.com/watch?v=7UstS0hsHgI
Remi

0

Puoi comporre tutte le funzioni in una e chiamarle. Le librerie come Ramdajs hanno una funzione per comporre più funzioni in una.

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

oppure puoi mettere la composizione come una funzione separata nel file js e chiamarla

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


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

0

Questa è un'alternativa a brad anser : puoi usare la virgola come segue

onclick="funA(), funB(), ..."

tuttavia è meglio NON utilizzare questo approccio - per i piccoli progetti è possibile utilizzare onclick solo in caso di chiamata di una funzione (altro: javascript discreto aggiornato ).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.