Вы можете установить href в #!
вместо #
Например,
Link
не будет выполнять прокрутку при нажатии.
Осторожно! Это все равно добавит запись в историю браузера при щелчке, а это означает, что после нажатия вашей ссылки кнопка возврата пользователя не приведет их к странице, на которой они были ранее. По этой причине, вероятно, лучше использовать подход .preventDefault()
или использовать оба в комбинации.
Вот сценарий, иллюстрирующий это (просто попробуйте свой браузер до тех пор, пока ваш получить полосу прокрутки): http://jsfiddle.net/9dEG7/
Это поведение указан в спецификации HTML5 в разделе . Переход к разделу идентификатора фрагмента . Причина, по которой ссылка с href в "#"
заставляет документ прокручиваться вверх, заключается в том, что это поведение явно указано как способ обработки пустого идентификатора фрагмента:
2. Если
blockquote>fragid
является пустой строкой, указанная часть документа является верхней частью документаИспользование href из
"#!"
вместо этого работает просто потому что он избегает этого правила. В восклицательном знаке нет ничего волшебного - он просто делает удобный идентификатор фрагмента, потому что он заметно отличается от типичного хрупкого и вряд ли когда-либо сопоставим сid
илиname
элемента на вашей странице. Действительно, мы могли бы положить почти что-нибудь после хэша; единственными фрагментами, которых недостаточно, являются пустая строка, слово «верх» или строки, которые соответствуют атрибутамname
илиid
элементов на странице.Точнее, нам просто нужно идентификатор фрагмента, который заставит нас перейти к шагу 8 в следующем алгоритме для определения указанной части документа из fragid:
blockquote>
- Apply алгоритм парсера URL-адреса для URL-адреса и пусть fragid будет фрагментным компонентом результирующего проанализированного URL.
- Если
fragid
- пустая строка , то указанная часть документа является верхней частью документа; остановите алгоритм здесь.- Пусть
fragid bytes
является результатом процентного декодированияfragid
.- Пусть
decoded fragid
является результатом применения алгоритма декодера UTF-8 кfragid bytes
. Если декодер UTF-8 испускает ошибку декодера, отмените декодер и вместо этого перейдите к шагу с меткойno decoded fragid
.- Если в DOM есть элемент, который имеет ID, точно равный
decoded fragid
, то первым таким элементом в древовидном порядке является указанная часть документа; остановите алгоритм здесь.- Не декодировано fragid : Если в DOM есть элемент, у которого есть атрибут имени, значение которого точно равно
fragid
( notdecoded fragid
), то первым таким элементом в древовидном порядке является указанная часть документа; остановите алгоритм здесь.- Если fragid является ASCII-регистрозависимым совпадением для строки
top
, то указанная часть документа является верхней частью документа; остановите алгоритм здесь.- В противном случае указана не какая-либо часть документа.
Пока мы нажимаем на шаге 8 и там не указано в документе , вступает в игру следующее правило:
Если нет указанной части ... тогда пользовательский агент ничего не должен делать.
blockquote>, поэтому браузер не просматривает.