Необходимо предотвратить действие по умолчанию для события click (т. Е. Перейти к цели ссылки).
Есть два способа сделать это.
Опция 1: event.preventDefault()
Вызовите .preventDefault()
метод объекта события, переданного вашему обработчику. Если вы используете jQuery для привязки ваших обработчиков, это событие будет экземпляром jQuery.Event
и будет версией jQuery .preventDefault()
. Если вы используете addEventListener
для привязки ваших обработчиков, это будет Event
версия DOM .preventDefault()
. В любом случае будет делать то, что вам нужно.
Примеры:
$('#ma_link').click(function($e) {
$e.preventDefault();
doSomething();
});
document.getElementById('#ma_link').addEventListener('click', function (e) {
e.preventDefault();
doSomething();
})
Вариант 2: return false;
В jQuery :
Возвращение false из обработчика событий автоматически вызовет event.stopPropagation () и event.preventDefault ()
Итак, с jQuery вы можете альтернативно использовать этот подход для предотвращения поведения ссылки по умолчанию:
$('#ma_link').click(function(e) {
doSomething();
return false;
});
Если вы используете необработанные события DOM, это также будет работать в современных браузерах, поскольку спецификация HTML 5 диктует такое поведение. Тем не менее, старые версии спецификации этого не сделали, поэтому, если вам нужна максимальная совместимость со старыми браузерами, вам следует .preventDefault()
явно позвонить . См. Event.preventDefault () и return false (без jQuery) для подробностей спецификации.
Паоло Бергантино
источник
Вы можете установить свой HREF
#!
вместо#
Например,
не будет выполнять прокрутку при нажатии.
Осторожно! При нажатии по-прежнему будет добавлена запись в историю браузера, а это означает, что после нажатия на вашу ссылку кнопка «Назад» пользователя не приведет к переходу на страницу, на которой он был ранее. По этой причине, вероятно, лучше использовать
.preventDefault()
подход или использовать оба в комбинации.Вот Скрипка, иллюстрирующая это (просто включите браузер, пока не получите полосу прокрутки):
http://jsfiddle.net/9dEG7/
Для умников - почему это работает:
Это поведение указано в спецификации HTML5 в разделе « Переход к идентификатору фрагмента ». Причина, по которой ссылка с href
"#"
приводит к прокрутке документа до самого верха, заключается в том, что это поведение явно указывается как способ обработки пустого идентификатора фрагмента:Использование href
"#!"
вместо этого работает просто потому, что оно избегает этого правила. В восклицательном знаке нет ничего волшебного - он просто делает удобный идентификатор фрагмента, поскольку он заметно отличается от типичного фрагмента и вряд ли когда-id
либо будетname
соответствовать элементу или элементу на вашей странице. В самом деле, мы можем поместить почти все после хэша; единственные фрагменты, которых будет недостаточно, - это пустая строка, слово «top» или строки, которые соответствуютname
илиid
атрибуты элементов на странице.Точнее, нам просто нужен идентификатор фрагмента, который заставит нас перейти к шагу 8 в следующем алгоритме для определения указанной части документа из фрагмента:
Пока мы нажимаем на шаге 8, и в нем нет указанной части документа , в игру вступает следующее правило:
Вот почему браузер не прокручивает.
источник
preventDefault()
в обработчике кликов - довольно печально.Простой подход заключается в использовании этого кода:
Этот подход не требует обновления страницы, поэтому полоса прокрутки остается на месте. Кроме того, он позволяет программно изменять событие onclick и обрабатывать привязку событий на стороне клиента с помощью jQuery.
По этим причинам вышеупомянутое решение лучше чем:
где последнее решение позволит избежать проблемы с прокруткой, если и только если метод myClickHandler не потерпит неудачу.
источник
Возврат false из кода, который вы вызываете, будет работать и в ряде случаев является предпочтительным методом, но вы также можете так
Когда дело доходит до SEO, это действительно зависит от того, для чего будет использоваться ваша ссылка. Если вы собираетесь использовать его для ссылки на какой-либо другой контент, то я бы в идеале согласился, что вы хотели бы что-то значимое здесь, но если вы используете ссылку для функциональных целей, например, переполнение стека для панели инструментов пост (жирный, курсив, гиперссылка) и т. д.) тогда это, вероятно, не имеет значения.
источник
Вы должны изменить
в
Таким образом, при нажатии на ссылку страница не будет прокручиваться вверх. Это чище, чем использование href = "#" и предотвращение запуска события по умолчанию.
У меня есть веские причины для этого при первом ответе на этот вопрос , например, что
return false;
не будет выполняться, если вызываемая функция выдает ошибку, или вы можете добавить функциюreturn false;
вdoSomething()
функцию и затем забыть использоватьreturn doSomething();
источник
Попробуй это:
источник
Если вы можете просто изменить
href
значение, вы должны использовать:Еще одно изящное решение, которое я только что придумал, - это использование jQuery, чтобы остановить действие щелчка и вызвать прокрутку страницы, но только для
href="#"
ссылок.источник
return false
должно быть послеpreventDefault()
строки, иначе вы никогда не попадете на эту вторую строку?Ссылка на что-то более разумное, чем верх страницы в первую очередь. Затем отмените событие по умолчанию.
См. Правило 2 прагматического прогрессивного улучшения .
источник
Также вы можете использовать event.preventDefault внутри атрибута onclick .
Не нужно писать событие клика exstra.
источник
Вы можете просто написать так же:
источник
При вызове функции следуйте ее
return false
примеру:источник
Создайте страницу, которая содержит две ссылки - одну вверху и одну внизу. При нажатии на верхнюю ссылку страница должна прокручиваться вниз до нижней части страницы, где присутствует нижняя ссылка. При нажатии на нижнюю ссылку страница должна прокручиваться вверх до верхней части страницы.
источник
это будет работать нормально. нет необходимости добавлять href = "#"
источник
Вы можете проверить свой CSS. В примере здесь: https://css-tricks.com/the-checkbox-hack/ есть
position: absolute; top: -9999px;
. Это особенно глупо в Chrome, так какonclick="whatever"
все равно переходит в абсолютную позицию элемента, по которому щелкнули.Удаление
position: absolute; top: -9999px;
,display: none;
может помочь.источник
Для Bootstrap 3 для свертывания, если вы не укажете data-target на привязке и используете href для определения цели, событие будет предотвращено. Если вы используете data-target, вам нужно предотвратить событие самостоятельно.
источник