Как сохранить фокус на текущей таблице данных на длинной странице данных [дублировать]

121
задан Mark Amery 24 February 2015 в 14:52
поделиться

14 ответов

Вы можете установить href в #! вместо #

Например,

<a href="#!">Link</a>

не будет выполнять прокрутку при нажатии.

Осторожно! Это все равно добавит запись в историю браузера при щелчке, а это означает, что после нажатия вашей ссылки кнопка возврата пользователя не приведет их к странице, на которой они были ранее. По этой причине, вероятно, лучше использовать подход .preventDefault() или использовать оба в комбинации.

Вот сценарий, иллюстрирующий это (просто попробуйте свой браузер до тех пор, пока ваш получить полосу прокрутки): http://jsfiddle.net/9dEG7/


Для спецификаторов - почему это работает:

Это поведение указан в спецификации HTML5 в разделе . Переход к разделу идентификатора фрагмента . Причина, по которой ссылка с href в "#" заставляет документ прокручиваться вверх, заключается в том, что это поведение явно указано как способ обработки пустого идентификатора фрагмента:

2. Если fragid является пустой строкой, указанная часть документа является верхней частью документа

Использование href из "#!" вместо этого работает просто потому что он избегает этого правила. В восклицательном знаке нет ничего волшебного - он просто делает удобный идентификатор фрагмента, потому что он заметно отличается от типичного хрупкого и вряд ли когда-либо сопоставим с id или name элемента на вашей странице. Действительно, мы могли бы положить почти что-нибудь после хэша; единственными фрагментами, которых недостаточно, являются пустая строка, слово «верх» или строки, которые соответствуют атрибутам name или id элементов на странице.

Точнее, нам просто нужно идентификатор фрагмента, который заставит нас перейти к шагу 8 в следующем алгоритме для определения указанной части документа из fragid:

  1. Apply алгоритм парсера URL-адреса для URL-адреса и пусть fragid будет фрагментным компонентом результирующего проанализированного URL.
  2. Если fragid - пустая строка , то указанная часть документа является верхней частью документа; остановите алгоритм здесь.
  3. Пусть fragid bytes является результатом процентного декодирования fragid .
  4. Пусть decoded fragid является результатом применения алгоритма декодера UTF-8 к fragid bytes . Если декодер UTF-8 испускает ошибку декодера, отмените декодер и вместо этого перейдите к шагу с меткой no decoded fragid .
  5. Если в DOM есть элемент, который имеет ID, точно равный decoded fragid , то первым таким элементом в древовидном порядке является указанная часть документа; остановите алгоритм здесь.
  6. Не декодировано fragid : Если в DOM есть элемент, у которого есть атрибут имени, значение которого точно равно fragid ( not decoded fragid ), то первым таким элементом в древовидном порядке является указанная часть документа; остановите алгоритм здесь.
  7. Если fragid является ASCII-регистрозависимым совпадением для строки top, то указанная часть документа является верхней частью документа; остановите алгоритм здесь.
  8. В противном случае указана не какая-либо часть документа.

Пока мы нажимаем на шаге 8 и там не указано в документе , вступает в игру следующее правило:

Если нет указанной части ... тогда пользовательский агент ничего не должен делать.

, поэтому браузер не просматривает.

183
ответ дан Community 26 August 2018 в 21:33
поделиться

Вы должны изменить

<a href="#">My Link</a>

на

<a href="javascript:;">My Link</a>

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

У меня есть веские причины для этого в первом ответе на этот вопрос , например return false; не будет выполняться, если вызываемая функция выдает ошибку или вы можете добавить функцию return false; к функции doSomething(), а затем забудьте использовать return doSomething();

5
ответ дан achecopar 26 August 2018 в 21:33
поделиться

При вызове функции следуйте этому примеру return false:

<input  type="submit" value="Add" onclick="addNewPayment();return false;">
0
ответ дан buddhi weerasinghe 26 August 2018 в 21:33
поделиться

Создайте страницу, содержащую две ссылки: одну вверху и одну внизу. При нажатии на верхнюю ссылку страница должна прокручиваться вниз до нижней части страницы, где присутствует нижняя ссылка. При нажатии на нижнюю ссылку страница должна прокручиваться до верхней части страницы.

0
ответ дан Damini 26 August 2018 в 21:33
поделиться

Если вы можете просто изменить значение href, вы должны использовать:

<a href="javascript:void(0);">Link Title</a>

Еще одно опрятное решение, с которым я только что придумал, - это использовать jQuery, чтобы остановить действие click. страницы для прокрутки, но только для ссылок href="#".

<script type="text/javascript">
    /* Stop page jumping when links are pressed */
    $('a[href="#"]').live("click", function(e) {
         return false; // prevent default click action from happening!
         e.preventDefault(); // same thing as above
    });
</script>
2
ответ дан dazbradbury 26 August 2018 в 21:33
поделиться

Для Bootstrap 3 для коллапса, если вы не укажете цель данных на якоре и не полагаетесь на href для определения цели, событие будет предотвращено. Если вы используете цель данных, вам нужно будет предотвратить это событие самостоятельно.

<button type="button" class="btn btn-default" data-toggle="collapse" data-target="#demo">Collapse This</button>

<div id="demo" class="collapse"> 
<p>Lorem ipsum dolor sit amet</p>
</div>
0
ответ дан doug 26 August 2018 в 21:33
поделиться

Кроме того, вы можете использовать event.preventDefault внутри атрибута onclick.

<a href="#" onclick="event.preventDefault(); doSmth();">doSmth</a>

Не нужно писать событие exstra click.

2
ответ дан efirat 26 August 2018 в 21:33
поделиться

Возврат false из кода, который вы вызываете, будет работать, и в ряде случаев это предпочтительный метод, но вы также можете это сделать

<a href="javascript:;">Link Title</a>

. Когда дело доходит до SEO, это действительно зависит от того, что ваша ссылка будет использована для. Если вы собираетесь использовать его для ссылки на какой-либо другой контент, то я бы согласился в идеале, что вы хотите что-то значимое здесь, но если вы используете ссылку для функциональных целей, возможно, например, Stack Overflow делает для панели сообщений (жирный, курсив, гиперссылка , и т. д.), то это, вероятно, не имеет значения.

10
ответ дан Mark Amery 26 August 2018 в 21:33
поделиться
<a onclick="yourfunction()">

это будет работать нормально. нет необходимости добавлять href = "#"

0
ответ дан Martijn Pieters 26 August 2018 в 21:33
поделиться

Попробуйте следующее:

<a href="#" onclick="return false;">My Link</a>
6
ответ дан mikeluby 26 August 2018 в 21:33
поделиться

Легким подходом является использование этого кода:

<a href="javascript:void(0);">Link Title</a>

Этот подход не заставляет обновлять страницу, поэтому полоса прокрутки остается на месте. Кроме того, он позволяет программно изменять событие onclick и обрабатывать привязку к стороне клиента с помощью jQuery.

По этим причинам вышеприведенное решение лучше, чем:

<a href="javascript:myClickHandler();">Link Title</a>
<a href="#" onclick="myClickHandler(); return false;">Link Title</a>

, где последнее решение позволит избежать проблемы с прокруткой, если и только если метод myClickHandler не завершился неудачей.

24
ответ дан phreeskier 26 August 2018 в 21:33
поделиться

Ссылка на что-то более разумное, чем верхняя часть страницы в первую очередь. Затем отмените событие по умолчанию.

См. правило 2 прагматического прогрессивного улучшения .

3
ответ дан Quentin 26 August 2018 в 21:33
поделиться

Возможно, вы захотите проверить свой CSS. В примере здесь: https://css-tricks.com/the-checkbox-hack/ есть position: absolute; top: -9999px;. Это особенно неприятно для Chrome, так как onclick="whatever" все еще перескакивает в абсолютное положение щелкнутого элемента.

Удаление position: absolute; top: -9999px;, для display: none; может помочь.

0
ответ дан urbanaut 26 August 2018 в 21:33
поделиться

Вы можете просто написать так же: -

<a href="#!" onclick="function()">Delete User</a>
0
ответ дан user2436792 26 August 2018 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: