Jak mogę usunąć hash lokalizacji bez powodowania przewijania strony?

Czy możliwe jest usunięcie hasha z window.location bez powodowania przeskakiwania strony-przewijania do góry? Muszę być w stanie zmodyfikować hash bez powodowania żadnych skoków.

Mam to:

$('<a href="#123">').text('link').click(function(e) {
  e.preventDefault();
  window.location.hash = this.hash;
}).appendTo('body');

$('<a href="#">').text('unlink').click(function(e) {
  e.preventDefault();
  window.location.hash = '';
}).appendTo('body');

Zobacz przykład na żywo tutaj: http://jsbin.com/asobi

Gdy użytkownik kliknie 'link ' tag hash jest modyfikowany bez żadnych skoków strony, więc to działa dobrze.

Ale gdy użytkownik kliknie ' unlink ' tag has jest usuwany i przewijanie strony-przeskakuje na szczyt. Muszę usunąć hash bez tego efektu ubocznego.

Author: Andy E, 2010-02-19

8 answers

Wierzę, że jeśli po prostu umieścić w atrapa hash to nie będzie przewijać, ponieważ nie ma dopasowania do przewijania.

<a href="#A4J2S9F7">No jumping</a>

Lub

<a href="#_">No jumping</a>

"#" sam w sobie jest odpowiednikiem "_top" powoduje więc przewinięcie do góry strony

 92
Author: scunliffe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 15:30:39

Używam następujących NA kilku stronach, żadnych skoków strony!

Ładny czysty pasek adresu dla przeglądarek przyjaznych HTML5 i po prostu # dla starszych przeglądarek.

$('#logo a').click(function(e){
    window.location.hash = ''; // for older browsers, leaves a # behind
    history.pushState('', document.title, window.location.pathname); // nice and clean
    e.preventDefault(); // no page reload
});
 33
Author: neokio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-18 10:39:35

Okno.lokalizacja jest głupia pod kilkoma względami. Jest to jedna z nich; druga jest taka, że ma różne wartości get I set:

window.location.hash = "hello";  // url now reads *.com#hello
alert(window.location.hash);   // shows "#hello", which is NOT what I set.
window.location.hash = window.location.hash; // url now reads *.com##hello

Zauważ, że ustawienie właściwości hash na " usuwa również znak hash; to jest to, co przekierowuje stronę. Aby ustawić wartość części skrótu adresu url na", pozostawiając znak skrótu, a tym samym nie odświeżając, napisz to:

window.location.href = window.location.href.replace(/#.*$/, '#');

Nie ma możliwości całkowitego usunięcia znaku skrótu po ustawieniu bez odświeżania strona.

Aktualizacja 2012:

Jak zauważyli Blazemonger i thinkdj, technologia uległa poprawie. Niektóre przeglądarki pozwalają wyczyścić ten hashtag, ale niektóre nie. Aby wesprzeć oba, spróbuj czegoś takiego:
if ( window.history && window.history.pushState ) { 
    window.history.pushState('', '', window.location.pathname) 
} else { 
    window.location.href = window.location.href.replace(/#.*$/, '#'); 
}
 18
Author: olooney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-09 03:23:40

To jest stary post, ale chciałem podzielić się moim rozwiązaniem Wszystkie linki w moim projekcie, które są obsługiwane przez JS, mają atrybut href="#_js" (lub jakąkolwiek nazwę chcesz użyć tylko do tego celu), a na inicjalizacji strony robię:

$('body').on('click.a[href="#_js"]', function() {
    return false;
});

That ' ll do the trick

 3
Author: Tomer Gal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-17 13:13:02

Ustawianie okna.miejsce.hash do pustej lub nieistniejącej nazwy kotwicy zawsze wymusi Przejście strony do góry. Jedynym sposobem, aby temu zapobiec, jest złapanie pozycji przewijania okna i ustawienie go ponownie po zmianie skrótu.

Wymusi to również przemalowanie strony( nie można tego uniknąć), chociaż ponieważ jest wykonywana w jednym procesie js, nie będzie skakać w górę/w dół (teoretycznie).

$('<a href="#123">').text('link').click(function(e) {
    e.preventDefault();
    window.location.hash = this.hash;
}).appendTo('body');

$('<a href="#">').text('unlink').click(function(e) {
    e.preventDefault();
    var pos = $(window).scrollTop(); // get scroll position
    window.location.hash = '';
    $(window).scrollTop(pos); // set scroll position back
}).appendTo('body');
Mam nadzieję, że to pomoże.
 2
Author: BGerrissen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-19 11:49:13

Nie jestem pewien, czy to da pożądany efekt, spróbuj:

$('<a href="#">').text('unlink').click(function(e) {
    e.preventDefault();
    var st = parseInt($(window).scrollTop())
    window.location.hash = '';
    $('html,body').css( { scrollTop: st });  
});

Zasadniczo Zapisz przesunięcie przewijania i przywróć je po przypisaniu pustego skrótu.

 1
Author: Tom Bartel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-19 11:35:54

Próbowałeś return false; w programie obsługi zdarzenia? jQuery robi coś specjalnego, gdy to robisz, podobnie, ale AFAIK bardziej wpływowe, niż e.preventDefault.

 1
Author: Roman Nurik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-19 11:43:25

Mam nadzieję, że to pomoże

Html

<div class="tabs">
  <ul>
    <li><a href="#content1">Tab 1</a></li>
    <li><a href="#content2">Tab 2</a></li>
    <li><a href="#content3">Tab 3</a></li>
  </ul>
</div>
<div class="content content1">
    <p>1. Content goes here</p>
</div>
<div class="content content2">
    <p>2. Content goes here</p>
</div>
<div class="content content3">
    <p>3. Content goes here</p>
</div>

Js

function tabs(){
  $(".content").hide();

  if (location.hash !== "") {
    $('.tabs ul li:has(a[href="' + location.hash + '"])').addClass("active");
    var hash = window.location.hash.substr(1);
    var contentClass = "." + hash;
    $(contentClass).fadeIn();
  } else {
    $(".tabs ul li").first().addClass("active");
    $('.tabs').next().css("display", "block");
  }
}
tabs();

$(".tabs ul li").click(function(e) {
  $(".tabs ul li").removeAttr("class");
  $(this).addClass("active");
  $(".content").hide();
  var contentClass = "." + $(this).find("a").attr("href").substr(1);
  $(contentClass).fadeIn();
  window.location.hash = $(this).find("a").attr("href");
  e.preventDefault();
  return false;
});

URL bez hasha.
http://output.jsbin.com/tojeja

URL z hashtagiem, który nie przeskakuje do kotwicy.
http://output.jsbin.com/tojeja#content1

 0
Author: Shak Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-03 15:39:25