Qual è l'effetto dell'aggiunta di "return false" a un listener di eventi click?


359

Molte volte ho visto collegamenti come questi nelle pagine HTML:

<a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a>

Qual è l'effetto di return falsedentro?

Inoltre, di solito non lo vedo nei pulsanti.

Questo è specificato ovunque? In alcune specifiche in w3.org?


5
E il problema pratico nell'esempio di leonel è che se la pagina corrente viene spostata in qualche modo verso il basso, salterà in cima senza il ritorno falso;
roenving,

Il mio IntelliJ si lamenta di "return false;" con il messaggio "definizione funzione esterna"
ses

Risposte:


310

Il valore di ritorno di un gestore eventi determina se deve avvenire anche il comportamento predefinito del browser. Nel caso in cui si fa clic sui collegamenti, ciò seguirà il collegamento, ma la differenza è più evidente nei gestori di invio dei moduli, in cui è possibile annullare l'invio di un modulo se l'utente ha commesso un errore nell'inserimento delle informazioni.

Non credo ci sia una specifica W3C per questo. Tutte le antiche interfacce JavaScript come questa hanno ricevuto il soprannome di "DOM 0" e sono per lo più non specificate. Potresti avere fortuna leggendo la vecchia documentazione di Netscape 2.

Il modo moderno di ottenere questo effetto è chiamare event.preventDefault(), e questo è specificato nella specifica Eventi DOM 2 .


41
event.preventDefault ? event.preventDefault() : event.returnValue = false;funzionerà anche in IE

3
Tutti i browser tranne Chrome funzionavano con il return falsemetodo, ma avevo bisogno event.preventDefaultdi Chrome.
DOOManiac

3
Chrome funziona return falseora con il metodo. Smette di seguire il collegamento nell'evento onclick di un elemento img.
Bao

In semplice formato JS, il gestore di invio che restituisce false non funziona (almeno in Chrome), quindi utilizzo e.preventDefault (). secondo il commento di @ 2astalavista sopra e.preventDefault fallisce in IE, quindi usa il suo metodo: event.preventDefault? event.preventDefault (): event.returnValue = false;
luigi7up

162

Puoi vedere la differenza con il seguente esempio:

<a href="http://www.google.co.uk/" onclick="return (confirm('Follow this link?'))">Google</a>

Facendo clic su "OK" viene restituito true e viene seguito il collegamento. Fare clic su "Annulla" restituisce false e non segue il collegamento. Se javascript è disabilitato, il collegamento viene seguito normalmente.


7
Esattamente quello che stavo cercando, funziona perfettamente anche sui pulsanti di invio! <button type="submit" onclick="return confirm('Do you really want to delete this?');">Delete</button>
ArendE

27

Ecco una routine più solida per annullare il comportamento predefinito e il bubbling di eventi in tutti i browser:

// Prevents event bubble up or any usage after this is called.
eventCancel = function (e)
{
    if (!e)
        if (window.event) e = window.event;
    else return;
    if (e.cancelBubble != null) e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
    if (e.preventDefault) e.preventDefault();
    if (window.event) e.returnValue = false;
    if (e.cancel != null) e.cancel = true;
}

Un esempio di come questo sarebbe usato in un gestore di eventi:

// Handles the click event for each tab
Tabstrip.tabstripLinkElement_click = function (evt, context) 
{
    // Find the tabStrip element (we know it's the parent element of this link)
    var tabstripElement = this.parentNode;
    Tabstrip.showTabByLink(tabstripElement, this);
    return eventCancel(evt);
}

Uno spessore è bello, ma qual è il vantaggio pratico rispetto return false;? La risposta di kamesh si occupa un po 'di questo, ma poiché c'è una possibilità che il tuo shim faccia l'uno o l'altro, in che modo questi risultati separati faranno tabstripLinkElement_clickcambiare operazione da browser a browser? Se non c'è alcuna differenza operativa, perché (in pratica) preoccuparsi (anche se, in teoria, questa è la cosa giusta da fare)? Grazie e AIA per la domanda di risposta agli zombi.
ruffin,

7
Il primo blocco di codice ha un finale else. Stile di programmazione orribile. Aggiungi alcune parentesi graffe quindi non è ambiguo.
mbomb007,

23

COSA "restituisce false" STA FACENDO REALMENTE ?

return false sta effettivamente facendo tre cose molto separate quando lo chiami:

  1. event.preventDefault ();
  2. event.stopPropagation ();
  3. Interrompe l'esecuzione della richiamata e ritorna immediatamente quando viene chiamato.

Vedi jquery-events-stop-misusing-return-false per maggiori informazioni.

Per esempio :

facendo clic su questo collegamento, restituire false annulla il comportamento predefinito del browser .

<a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a>

7
onclick = "return false" non equivale a restituire false da un gestore eventi click jQuery. I browser impediscono solo il gestore predefinito (ad es. e.preventDefault()) Ma non bloccano la propagazione. Vedi: jsfiddle.net/18yq1783
Jamie Treworgy il

1
Dopo, il link al blog è interrotto. Un archivio è qui .
ruffin,

16

La risintonizzazione falsa da un evento JavaScript di solito annulla il comportamento "predefinito" - nel caso dei collegamenti, indica al browser di non seguire il collegamento.


5
"generalmente"? quindi non sempre?
Maria Ines Parnisari,

12

Credo che ciò non accada l'evento standard.

Nel tuo esempio il browser non tenterà di andare su #.


12

Return false interromperà il collegamento ipertestuale seguito dopo l'esecuzione di JavaScript. Questo è utile per javascript discreto che degrada con garbo - per esempio, potresti avere una miniatura che usa javascript per aprire un pop-up dell'immagine a dimensione intera. Quando javascript è disattivato o l'immagine viene cliccata al centro (aperta in una nuova scheda), questo ignora l'evento onClick e normalmente apre l'immagine come un'immagine a dimensione intera.

Se non fosse specificato return false, l'immagine avrebbe sia avviato il pop-up che aperto normalmente l'immagine. Alcune persone invece di utilizzare return false usano javascript come attributo href, ma ciò significa che quando javascript è disabilitato il link non farà nulla.


7

l'uso di return false in un evento onclick impedisce al browser di elaborare il resto dello stack di esecuzione, che include il seguire il collegamento nell'attributo href.

In altre parole, l'aggiunta di return false impedisce a href di funzionare. Nel tuo esempio, questo è esattamente quello che vuoi.

Nei pulsanti, non è necessario perché onclick è tutto ciò che potrà mai eseguire - non c'è href da elaborare e andare.


6

Il ritorno false sta dicendo di non eseguire l'azione predefinita, che nel caso di un <a href>è seguire il collegamento. Quando si restituisce false a onclick, l'href verrà ignorato.



3

Return false impedirà la navigazione. Altrimenti, la posizione diventerebbe il valore di ritorno di someFunc


no, la posizione diventerebbe il contenuto dell'attributo href
Chris Marasti-Georg,

La posizione diventa il valore restituito da someFunc se è href = "javascript: someFunc ()", non è così per i gestori di eventi.
Jim,

3

Questo return falseimpedisce la navigazione della pagina e lo scorrimento indesiderato di una finestra verso l'alto o il basso.

onclick="return false"

3

Sono sorpreso che nessuno abbia menzionato onmousedowninvece di onclick. Il

onclick='return false'

non rileva il comportamento predefinito del browser risultante nella selezione del testo (a volte indesiderato) per mousedownma

onmousedown='return false'

lo fa.

In altre parole, quando faccio clic su un pulsante, a volte il suo testo viene accidentalmente selezionato modificando l'aspetto del pulsante, che potrebbe essere indesiderato. Questo è il comportamento predefinito che stiamo cercando di prevenire qui. Tuttavia, l' mousedownevento viene registrato in precedenza click, quindi se si impedisce solo quel comportamento all'interno del clickgestore, ciò non influirà sulla selezione indesiderata derivante dalmousedown dall'evento. Quindi il testo viene ancora selezionato. Tuttavia, impedendo l'impostazione predefinita permousedown evento farà il lavoro.

Vedi anche event.preventDefault () vs. return false


@FrederikKrautwald Hai ragione, era criptico e avrei dovuto dire 'selezionando' non 'segnare'. Ho provato a scriverlo più chiaramente, spero che abbia più senso.
Dmitri Zaitsev,

0

Ho questo link sulla mia pagina HTML:

<a href = "" 
onclick = "setBodyHtml ('new content'); return false; "
> click here </a>

La funzione setBodyHtml () è definita come:

function setBodyHtml (s)
{ document.body.innerHTML = s;
}

Quando faccio clic sul collegamento, il collegamento scompare e il testo visualizzato nel browser diventa "nuovo contenuto".

Ma se rimuovo il "falso" dal mio link, fare clic sul link (apparentemente) non fa nulla. Perché?

È perché se non restituisco falso il comportamento predefinito di fare clic sul collegamento e visualizzare la sua pagina di destinazione si verifica, non viene annullato. MA, qui l'href del collegamento ipertestuale è "", quindi si collega alla stessa pagina corrente. Quindi la pagina viene effettivamente aggiornata e apparentemente non succede nulla.

Sullo sfondo la funzione setBodyHtml () viene ancora eseguita. Assegna il suo argomento a body.innerHTML. Ma poiché la pagina viene immediatamente aggiornata / ricaricata, il contenuto del corpo modificato non rimane visibile per più di qualche millisecondo, quindi non lo vedrò.

Questo esempio mostra perché a volte è UTILE utilizzare "return false".

Voglio assegnare ALCUNI href al link, in modo che sia mostrato come link, come testo sottolineato. Ma non voglio che il clic sul link per ricaricare efficacemente la pagina. Voglio che il navigatore predefinito = il comportamento venga annullato e qualunque effetto collaterale sia causato chiamando la mia funzione affinché diventi attiva. Pertanto devo "restituire false".

L'esempio sopra è qualcosa che potresti provare rapidamente durante lo sviluppo. Per la produzione, è più probabile che tu assegni un gestore di clic in JavaScript e chiami invece preventDefault (). Ma per una rapida prova il "return false" sopra fa il trucco.


0

Quando si utilizzano i moduli , è possibile utilizzare "return false" per impedire l'invio.

function checkForm() {
    // return true to submit, return false to prevent submitting
}
<form onsubmit="return checkForm()">
    ...
</form>
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.