Каков эффект добавления 'return false' в прослушиватель событий щелчка?


359

Много раз я видел такие ссылки на страницах HTML:

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

Какой там эффект return false?

Кроме того, я обычно не вижу этого в кнопках.

Это указано где-нибудь? В какой спецификации в w3.org?


5
И практическая проблема в примере Леонеля состоит в том, что если текущая страница прокручивается вниз каким-либо образом, она переместится наверх без возврата false;
Реннинг

Мой IntelliJ жалуется на «возвращение ложного»; с сообщением "определение внешней функции"
ses

Ответы:


310

Возвращаемое значение обработчика события определяет, должно ли происходить поведение браузера по умолчанию. В случае нажатия на ссылки, это будет переход по ссылке, но разница наиболее заметна в обработчиках отправки формы, где вы можете отменить отправку формы, если пользователь допустил ошибку при вводе информации.

Я не верю, что для этого есть спецификация W3C. Все древние интерфейсы JavaScript, подобные этому, получили прозвище «DOM 0» и в основном не указаны. Возможно, вам повезет, прочитав старую документацию Netscape 2.

Современный способ достижения этого эффекта - вызов event.preventDefault(), и это указано в спецификации DOM 2 Events .


41
event.preventDefault ? event.preventDefault() : event.returnValue = false;тоже будет работать в IE

4
Все браузеры, кроме Chrome, работали с этим return falseметодом, но мне нужен был event.preventDefaultChrome.
DOOManiac

3
Хром работает с return falseметодом сейчас. Прекращает переход по ссылке в событии onclick элемента img.
Бао

В простой JS-форме обработчик отправки, возвращающий false, не работает (по крайней мере, в 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>

Нажатие «Хорошо» возвращает true, и ссылка идет. Нажатие «Отмена» возвращает false и не переходит по ссылке. Если 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;? Ответ Камеша имеет дело с этим немного, но, так как есть шанс, что ваша подкладка делает один или другой, как эти отдельные результаты приведут к tabstripLinkElement_clickизменению операции от браузера к браузеру? Если нет операционной разницы, зачем (на практике) беспокоиться (даже если, теоретически, это правильно)? Спасибо, а AIA за зомби ответит на вопрос.
ruffin

7
Первый блок кода имеет трейлинг else. Ужасный стиль кодирования. Добавьте несколько фигурных скобок, чтобы они не были неоднозначными.
mbomb007

23

Что "вернуть ложь" ДЕЙСТВИТЕЛЬНО ДЕЛАЕТ ?

return false фактически делает три совершенно разные вещи, когда вы называете это:

  1. event.preventDefault ();
  2. event.stopPropagation ();
  3. Останавливает выполнение обратного вызова и немедленно возвращается при вызове.

Посмотрите jquery-events-stop-misusing-return-false для получения дополнительной информации.

Например :

при нажатии на эту ссылку возврат false отменяет поведение браузера по умолчанию .

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

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

1
Кстати, ссылка на блог не работает. Архив здесь .
ruffin

16

Возврат false из события JavaScript обычно отменяет поведение «по умолчанию» - в случае ссылок он говорит браузеру не переходить по ссылке.


5
"как правило"? так не всегда?
Мария Инес Парнисари

12

Я считаю, что стандартное событие не происходит.

В вашем примере браузер не будет пытаться перейти на #.


12

Возврат false остановит гиперссылку, по которой следуют после запуска JavaScript. Это полезно для ненавязчивого javascript, который изящно ухудшается - например, у вас может быть уменьшенное изображение, которое использует javascript, чтобы открыть всплывающее окно полноразмерного изображения. Когда javascript выключен или изображение щелкнуто по среднему значению (открывается на новой вкладке), это игнорирует событие onClick и просто открывает изображение как полноразмерное изображение в обычном режиме.

Если return false не было указано, изображение будет запускать всплывающее окно и открывать изображение как обычно. Некоторые люди вместо использования false возвращают использование javascript в качестве атрибута href, но это означает, что когда javascript отключен, ссылка ничего не будет делать.


7

использование return false в событии onclick останавливает браузер от обработки остальной части стека выполнения, что включает переход по ссылке в атрибуте href.

Другими словами, добавление return false останавливает работу href. В вашем примере это именно то, что вы хотите.

В кнопках это не нужно, потому что onclick - это все, что он когда-либо выполнит - нет необходимости обрабатывать и переходить к href.


6

Возвращаемое значение false говорит о том, что не предпринимается действие по умолчанию, которое в случае перехода <a href>заключается в переходе по ссылке. Когда вы вернете false в onclick, то href будет игнорироваться.



3

Возврат false будет препятствовать навигации. В противном случае местоположение станет возвращаемым значением someFunc.


нет, местоположение станет содержимым атрибута href
Крис Марасти-Георг,

Местоположение становится возвращаемым значением someFunc, только если это href = "javascript: someFunc ()", это не относится к обработчикам событий.
Джим

3

Это return falseпредотвращает перемещение по странице и нежелательную прокрутку окна вверх или вниз.

onclick="return false"

3

Я удивлен, что никто не упомянул onmousedownвместо onclick.

onclick='return false'

не улавливает поведение по умолчанию браузера в результате выделения (иногда нежелательным) текста происходит для mousedownно

onmousedown='return false'

делает.

Другими словами, когда я нажимаю на кнопку, ее текст иногда выбирается случайно, изменяя внешний вид кнопки, что может быть нежелательным. Это поведение по умолчанию, которое мы пытаемся предотвратить здесь. Однако mousedownсобытие регистрируется ранее click, поэтому, если вы только запретите такое поведение в своем clickобработчике, это не повлияет на нежелательный выбор, возникающий из этого mousedownсобытия. Таким образом, текст по-прежнему выбирается. Однако предотвращение дефолта дляmousedown события сделает работу.

Смотрите также event.preventDefault () против return false


@FrederikKrautwald Вы правы, это было загадочно, и я должен был сказать «выбирая», а не «отмечать». Я попытался написать это более ясно, надеюсь, это имеет больше смысла.
Дмитрий Зайцев

0

У меня есть эта ссылка на моей HTML-странице:

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

Функция setBodyHtml () определяется как:

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

Когда я нажимаю на ссылку, ссылка исчезает, а текст, отображаемый в браузере, меняется на «новый контент».

Но если я удаляю «ложь» из моей ссылки, щелчок по ссылке ничего не делает. Это почему?

Это происходит потому, что если я не верну false, поведение по умолчанию при нажатии на ссылку и отображении ее целевой страницы не отменяется. НО, здесь href гиперссылки "", поэтому он ссылается на ту же самую текущую страницу. Таким образом, страница просто обновляется, и, похоже, ничего не происходит.

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

Этот пример показывает, почему иногда полезно использовать «return false».

Я хочу назначить НЕКОТОРЫЙ href ссылке, чтобы она отображалась в виде ссылки в виде подчеркнутого текста. Но я не хочу, чтобы клик по ссылке просто перезагружал страницу. Я хочу, чтобы навигация по умолчанию = поведение было отменено, и любые побочные эффекты вызваны вызовом моей функции для принятия и сохранения в силе. Поэтому я должен «вернуть ложь».

Пример выше - это то, что вы бы быстро опробовали во время разработки. Для производства вы, скорее всего, назначите обработчик кликов в JavaScript и вместо этого вызовете protectDefault (). Но для быстрого опробования «возвращаемое ложное» выше делает свое дело.


0

При использовании форм , мы можем использовать «вернуть ложь», чтобы предотвратить отправку.

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.