Есть ли способ переопределить поведение браузера по умолчанию для нажатия на хэши? - PullRequest
3 голосов
/ 19 февраля 2011

Когда у меня есть следующее:

<a name='test'></a>

... и загрузив его в браузер, я могу добавить #test к URL-адресу, и браузер прокрутит его так, чтобы <a> находился вверху страницы.

Однако, Я хотел бы изменить это поведение (используя JavaScript, если это возможно), чтобы при использовании хэша не прокручивал страницу - я бы хотел, чтобы он просто ничего не делал .

Есть ли способ сделать это без удаления элемента <a>?


Обновление: Мне нужен браузер для отправки onhashchange() событий, но без прокрутки до элемента <a>. Причина в том, что я хочу переопределить прокрутку, сохранив уведомление о событии.

Ответы [ 5 ]

2 голосов
/ 19 февраля 2011

Быстрый грязный хак, но это то, на что вы можете опираться:

var curScroll = prevScroll = $(window).scrollTop()

$(window).bind('scroll', function() {
  prevScroll = curScroll
  curScroll = $(this).scrollTop()
}).bind('hashchange', function() {
  $(this).scrollTop(prevScroll)
})

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


UPD. Я только что нашел лучшее решение:

$('a').live('click', function() {
  if (this.href.split('#')[0] == location.href.split('#')[0]) {
    var scrollTop = $(window).scrollTop()
    setTimeout(function() {
      $(window).scrollTop(scrollTop)
    }, 0)
  }
})
1 голос
/ 25 октября 2014

Попробуйте это:

$( 'a[href="#"]' ).click( function(e) {
  e.preventDefault();
} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
1 голос
/ 19 февраля 2011

Ну, вы можете попытаться быть жестоким:

var i, elems = document.getElementsByTagName('a');
for (i = 0; i < elems.length; i++) {
    elems[i].removeAttribute('name');
}

Он должен быть запущен после того, как DOM будет готов, но до того, как он будет отрендерен, поэтому вы должны поместить его в нужное место. Это не будет работать для атрибутов 'id' - только с

Он делает то, что вы хотите?

0 голосов
/ 19 февраля 2011

возможно, вам понадобится немного манипулировать jquery и строками

removeHashPartFromString = function() {
 ...
}

$('a').each(function() {
    this.attr('href') = removeHashPartFromString(this.attr('href'));
}); 

Или найти элементы с хешем и удалить атрибуты имени хеша из этих элементов.

0 голосов
/ 19 февраля 2011

Хакерская техника заключается в том, чтобы просто автоматически прокручивать страницу вверх, если в URL есть хеш:

if (window.location.hash) {
    window.scrollTo(0, 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...