Как предотвратить прыжок на якорный щелчок?

Я использую e.preventDefault();, чтобы отключить поведение якоря по умолчанию.

Есть ли способ предотвратить только действие перехода к цели при нажатии?

Я пробовал:

  var hash = window.location.hash;
  var link = $('a');
  $('a').click(function() {
    e.preventDefault();
    hash = "#"+link.attr("href");
  });

Но это не работает: http://jsfiddle.net/ynts/LgcmB/.

Ответ 1

$(document).ready(function() {
  var hash = window.location.hash;
  var link = $('a');
  $('a').click(function(e) {
    e.preventDefault();
    hash = link.attr("href");
    window.location = hash;
  });
});

Вы также должны указать аргумент события в функции. Называя его как e или event, а затем вы можете манипулировать им.

Ответ 2

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

$('a').click(function (e) {
    var x = window.pageXOffset,
        y = window.pageYOffset;
    $(window).one('scroll', function () {
        window.scrollTo(x, y);
    })
});

Ответ 3

Чтобы только предотвратить "прыжок", вам нужно использовать другой идентификатор для целевого элемента, чем тот, который указан в якоре.

например. для ссылки на использование новой вкладки,

<a href="#new" />

а для маски целевого элемента id

<div id="new-tab"></div>

Затем в script добавьте маску к реальному хэшу и используйте его для получения элемента.

$(window).on("hashchange", function(){
    var hash = this.location.hash;
    var mytab = $(hash + "-tab");
});

Это сохраняет изменения местоположения хэша в истории браузера, которые могут управляться кнопками "назад/вперед", и обнаруживается при загрузке страницы с событием hashchange, если пользователь вводит страницу с указанным хешем.

Ответ 4

Вы должны привязать событие onclick для привязки и указать return false; в результате. Оператор return false; вызывает поведение кликов по умолчанию (переход) не будет работать. Вы можете найти более подробную информацию здесь: Как отключить привязку "jump" при загрузке страницы?

Ответ 5

Вам нужно передать событие на функцию.

         var hash = window.location.hash;
         var link = $('a');
         //pass event here
         $('a').click(function(e) {
           e.preventDefault();
           hash = "#"+link.attr("href");
         });

Ответ 6

Вы можете использовать match с ^ для обнаружения, начиная с #

$("a:link").on("click", function(e){
    if($(this).attr("href").match("^#")) {
        e.preventDefault();
        //some other stuff you want to do with the hash, like smooth scroll to anchor
        $('html, body').animate({ scrollTop: $($(this).attr("href")).offset().top }, 'fast');
    }
});