Який ефект від додавання "повернути помилку" слухачеві подій, що перебуває при натисканні?


359

Багато разів я бачив подібні посилання на сторінках HTML:

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

Який ефект return falseтам?

Крім того, я зазвичай не бачу цього в кнопках.

Це десь вказано? У якійсь специфікації в w3.org?


5
І практична проблема в прикладі leonel полягає в тому, що якщо поточна сторінка прокручується вниз якось, вона підскочить до вершини, не повертаючи помилку;
roenving

Мій IntelliJ скаржиться на "return false;" з «поза визначення функції» повідомлення
SES

Відповіді:


310

Повернене значення обробника подій визначає, чи має відбуватися поведінка браузера за замовчуванням. У випадку натискання на посилання це буде переходити за посиланням, але різниця найбільш помітна в обробниках подання форми, де ви можете скасувати подання форми, якщо користувач допустив помилку введенні інформації.

Я не вірю, що для цього є специфікація W3C. Усі стародавні інтерфейси JavaScript отримали прізвисько "DOM 0", і в основному вони не визначені. Можливо, вам пощастить прочитати стару документацію на Netscape 2.

Сучасний спосіб досягти цього ефекту - дзвонити event.preventDefault(), і це визначено в специфікації DOM 2 Events .


41
event.preventDefault ? event.preventDefault() : event.returnValue = false;також працюватиме в IE

3
Кожен браузер, окрім Chrome, працював із return falseметодом, але мені потрібен event.preventDefault.
DOOManiac

3
return falseЗараз Chrome працює з методом. Він перестає слідувати за посиланням у події onclick елемента img.
Бао

У звичайній формі JS відправлення обробника, який повертає помилку, не працює (принаймні в Chrome), тому я використовую e.preventDefault (). відповідно до коментаря @ 2astalavista вище e.preventDefault виходить з ладу в IE, тому використовуйте його метод: event.preventDefault? event.preventDefault (): event.returnValue = false;
luigi7up

162

Різницю ви можете побачити на наступному прикладі:

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

Клацання "Гаразд" повертає істину, і посилання виконується. Натиснувши "Скасувати", повертається помилково і не переходить за посиланням. Якщо JavaScript відключений, посилання виконується нормально.


7
Саме те, що я шукав, працює також ідеально на кнопках подання! <button type="submit" onclick="return confirm('Do you really want to delete this?');">Delete</button>
ArendE

27

Ось більш надійний розпорядок скасування поведінки за замовчуванням та подій у всіх браузерах:

// 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;
}

Приклад того, як це буде використано в обробці подій:

// 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);
}

Шим приємний, але в чому практична перевага return false;? Відповідь kamesh це стосується цього небагато, але оскільки є ймовірність, що ваш лайнер зробить той чи інший, яким чином ці окремі результати будуть робити tabstripLinkElement_clickоперацію зміни з браузера на браузер? Якщо немає різниці в експлуатації, навіщо (на практиці) турбуватися (навіть якщо теоретично це правильно зробити)? Дякую і AIA за відповідь на питання зомбі.
ruffin

7
У першому кодовому блоці є трейлінг else. Жахливий стиль кодування. Додайте кілька фігурних брекетів, щоб це було неоднозначно.
mbomb007

23

ЩО "повернути помилкове" ВЗАЄМНУВАТИ ВЗАЄМО РЕАЛЬНО РОБИТИ?

return false насправді робить три дуже різні речі, коли ви називаєте це:

  1. event.preventDefault ();
  2. event.stopPropagation ();
  3. Зупиняє виконання зворотного дзвінка і повертається негайно при виклику.

Дивіться jquery-події-стоп-неправильне використання-повернення-хибне .

Наприклад :

натиснувши це посилання, функція return false скасує поведінку браузера за замовчуванням .

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

7
onclick = "return false" не є тим самим, що повернення false з обробника подій клацання jQuery. Браузери запобігають лише обробці за замовчуванням (наприклад e.preventDefault()), але не припиняють розповсюдження. Дивіться: jsfiddle.net/18yq1783
Джеймі Треворі

1
Fwiw, посилання на блог порушено atm. Тут знаходиться архів .
ruffin

16

Повторне введення помилки з події JavaScript, як правило, скасовує поведінку "за замовчуванням" - у випадку посилань, він повідомляє браузеру не переходити за посиланням.


5
"зазвичай"? так не завжди?
Марія Інес Парнісарі

12

Я вважаю, що це призводить до того, що стандартна подія не відбудеться.

У вашому прикладі браузер не намагатиметься перейти до #.


12

Повернення false не призведе до того, що гіперпосилання буде виконуватися після запуску javascript. Це корисно для ненав’язливого javascript, який витончено погіршує - наприклад, у вас може бути ескізне зображення, яке використовує javascript для відкриття спливаючого зображення повнорозмірного зображення. Якщо javascript вимкнено або зображення клацнено середнім клавішею (відкривається на новій вкладці), воно ігнорує подію onClick і просто відкриває зображення як повнорозмірне зображення.

Якщо значення false не було вказано, зображення буде як запущене спливаюче, так і нормально відкрите зображення. Деякі люди замість того, щоб повернути помилкове використання javascript як атрибут href, але це означає, що при відключенні JavaScript посилання нічого не зробить.


7

використання return false в події onclick зупиняє браузер обробляти решту стека виконання, що включає перехід посилання в атрибуті href.

Іншими словами, додавання return false зупиняє роботу href. У вашому прикладі це саме те, що ви хочете.

У кнопках це не обов'язково, оскільки onclick - це все, що він коли-небудь буде виконувати - немає href для обробки та переходу.


6

Зворотна помилка говорить про те, що не вживати дій за замовчуванням, що у випадку з - <a href>це перейти за посиланням. Коли ви повернете помилку на onclick, href буде проігноровано.



3

Повернення помилково запобігає навігації. В іншому випадку розташування стане поверненим значенням деякогоFunc


ні, місце розташування стане вмістом атрибута href
Кріс Марасті-Георг,

Розташування стає поверненим значенням someFunc лише у тому випадку, якщо це href = "javascript: someFunc ()", це не стосується обробників подій.
Джим

3

У return falseзапобігає сторінка з здійснюється перехід і небажана прокрутка вікна до верхньої або нижньої частини .

onclick="return false"

3

Я здивований, що onmousedownзамість цього ніхто не згадав onclick. The

onclick='return false'

не сприймає поведінку браузера за замовчуванням, що призводить до (іноді небажаного) вибору тексту для, mousedownале

onmousedown='return false'

робить.

Іншими словами, коли я натискаю кнопку, її текст іноді стає випадково вибраним, змінюючи вигляд кнопки, що може бути небажаним. Це поведінка за замовчуванням, яку ми намагаємось запобігти тут. Однак mousedownподія зареєстрована раніше click, тому, якщо ви лише запобіжите такій поведінці всередині вашого clickобробника, це не вплине на небажаний вибір, що випливає з mousedownподії. Тож текст все одно вибирається. Однак, запобігання дефолту дляmousedown події виконає цю роботу.

Див. Також event.preventDefault () vs. return false


@FrederikKrautwald Ви маєте рацію, це було дурно, і я повинен був сказати "вибір", а не "маркування". Я намагався написати це більш чітко, сподіваюся, це має більше сенсу.
Дмитро Зайцев

0

Я маю це посилання на своїй HTML-сторінці:

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

Набір функційBodyHtml () визначається як:

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

Коли я натискаю на посилання, посилання зникає, а текст, показаний у браузері, змінюється на "новий вміст".

Але якщо я видалити "помилкове" зі свого посилання, натискання на посилання нічого не здасться. Чому так?

Це тому, що якщо я не повертаю помилкове, поведінка за замовчуванням натискання на посилання та відображення його цільової сторінки трапляється, не скасовується. АЛЕ, тут href гіперпосилання "", тому він посилається на поточну сторінку SAME. Тож сторінка фактично просто оновлюється і, здається, нічого не відбувається.

На задньому плані функція setBodyHtml () все ще виконується. Він присвоює свій аргумент body.innerHTML. Але оскільки сторінка оновлюється / перезавантажується, модифікований вміст тіла не залишається видимим більше декількох мілісекунд, тож я його не побачу.

Цей приклад показує, чому іноді КОРИСНО використовувати "return false".

Я хочу призначити деякий href для посилання, щоб він відображався як посилання, як підкреслений текст. Але я не хочу, щоб натискання на посилання ефективно перезавантажувало сторінку. Я хочу, щоб навігація за замовчуванням = поведінка була скасована і будь-які побічні ефекти, викликані закликом моєї функції прийняти та залишитися в силі. Тому я повинен "повернути помилкове".

Наведений вище приклад - це те, що ви швидко спробуєте під час розробки. Для виробництва ви, швидше за все, призначите обробник кліків у JavaScript і зателефонуйте на попередженняDefault (). Але для швидкого випробування вище "хибність повернення" робить трюк.


0

Під час використання форм , ми можемо використовувати “return false”, щоб запобігти надсиланню.

function checkForm() {
    // return true to submit, return false to prevent submitting
}
<form onsubmit="return checkForm()">
    ...
</form>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.