Yenilemede otomatik tarayıcı kaydırmasını önleyin


99

Bir sayfaya a gidip etrafta gezinirseniz, sayfayı yenilediğinizde bıraktığınız yerde yenilenir. Bu harika, ancak bu, url'de bir bağlantı konumu bulunan sayfalarda da görülür. Bir örnek olarak, bir bağlantıya tıkladığınızda http://example.com/post/244#comment5ve etrafınıza baktıktan sonra sayfayı yenilerseniz, bağlantıda olmayacaksınız ve sayfa zıplar. JavaScript ile bunu önlemenin bir yolu var mı? Böylece ne olursa olsun her zaman çapaya gideceksin.


Bir jQuery çözümü tamam mı yoksa düz js mi istiyorsunuz?
mrtsherman

Yanıtlar:


16

Tarayıcı davranışındaki değişiklikler nedeniyle bu çözüm artık önerilmemektedir. Diğer cevaplara bakın.

Temel olarak, bir çapa kullanılırsa, windows kaydırma olayına bağlanırız. Buradaki fikir, ilk kaydırma olayının tarayıcı tarafından yapılan otomatik yeniden konumlandırmaya ait olması gerektiğidir. Bu gerçekleştiğinde, kendi yeniden konumlandırmamızı yaparız ve ardından bağlı olayı kaldırırız. Bu, sonraki sayfa kaydırmalarının sistemde çalışmasını engeller.

$(document).ready(function() {
    if (window.location.hash) { 
        //bind to scroll function
        $(document).scroll( function() {
            var hash = window.location.hash
            var hashName = hash.substring(1, hash.length);
            var element;

            //if element has this id then scroll to it
            if ($(hash).length != 0) {
                element = $(hash);
            }
            //catch cases of links that use anchor name
            else if ($('a[name="' + hashName + '"]').length != 0)
            {
                //just use the first one in case there are multiples
                element = $('a[name="' + hashName + '"]:first');
            }

            //if we have a target then go to it
            if (element != undefined) {
                window.scrollTo(0, element.position().top);
            }
            //unbind the scroll event
            $(document).unbind("scroll");
        });
    }

});

Bunun hesaba katılması gerektiğini düşündüğüm bir kullanım örneği, kullanıcının otomatik kaydırma gerçekleşmeden önce sayfayı kaydırmasıdır. Hatırladığım kadarıyla otomatik kaydırma ancak sayfa tamamen yüklendikten sonra oluyor. Kullanıcı daha önce kaydırırsa, otomatik kaydırma iptal edilir. Bu nedenle, kullanıcı tarafından başlatılan kaydırma ile başlatılan tarayıcı arasında ayrım yapmak için bir yola ihtiyacınız olacaktır. Bunu nasıl yapacağımı bilmiyorum ama hatırladığım kadarıyla bu mümkün.
mrtsherman

1
Booyah! Bu eğlenceli bir gece problemiydi. Patronuma masamda uyuya kalmamın senin hatan olduğunu söylüyorum. Return ifadesini kaldırmak için hızlı bir değişiklik yaptım. Bu, kaydırma etkinliği için eklediğim bağın kaldırılmasına müdahale etti.
mrtsherman

Başlangıçta bunu kontrol etmek için küçük bir temel örnek dosyasında çalıştırdım. İşe yaradığını onayladıktan sonra, projemde nasıl çalışmadığına şaşırdım. Eliminasyon süreci sayesinde css dosyamda hataya neden olan tek bir stil bildirimi bulmayı başardım. Harici bir yazı tipinin uygulamasıydı. Kodunuzu bir işleve sardım ve şimdi onu doc.ready işleyicisindeki bir $ (window) .load () işleyicisine geçiriyorum. Şimdi çalışmak için dikiş atıyor (hafif bir başlangıç ​​sayfası titremesi ile). Kod için teşekkürler! Bunun sağlam bir düzeltme olup olmadığını bana bildirin.
ThomasReggi

1
Sayfa yüklendikten sonra yüklenen içeriğiniz varsa çalışmaz; Ör: ajax'tan pankartlarla doldurulacak 2 div'e sahip olmak.
Aralık 15'13

@FlashThunder - "çalışmıyor" u tanımlayabilir misiniz? Bir konsol mesajı mı göndereceksiniz?
mrtsherman

155

Chrome'da, scrollTop'u 0'a zorlasanız bile, ilk kaydırma olayından sonra atlayacaktır.

Parşömeni şuna bağlamalısınız:

$(window).on('beforeunload', function() {
    $(window).scrollTop(0);
});

Böylece tarayıcı, yenilemeden önce başlangıçta olduğuna inanacak şekilde kandırılır.


5
Kaydırma ile uğraşmak istemiyorsanız, kabul edilen cevaptan çok daha yararlıdır.
Dan Abramov

2
Bu, işi Chrome 33'te yapmıyor. Demek istediğim, yeni sayfayı yüklemeden önce en üste kayıyor. Ancak, tarayıcı bir şekilde önceki kaydırma konumunu hala hatırlar ve bu konuma aynı otomatik kaydırmayı gerçekleştirir.
Haralan Dobrev

1
Chrome 36, Firefox 30 ve IE 11'de test edilmiştir. Çok iyi çalışıyor!
Fizzix

26
JQuery dışı uygulama için: window.onbeforeunload = function(){ window.scrollTo(0,0); }
ProfNandaa

6
Neden 'boşaltma' yerine 'yüklemeden önce' olayını seçtiniz? Testlerim gösteriyor ki, sonuncusu sayfanın gerçekten tarayıcı tarafından kaldırılmadan önce yukarıya atlamayı önlemeye izin veriyor.
Aleksandr Zonov

79

Otomatik kaydırma geri yüklemesini devre dışı bırakmak için bu etiketi baş bölümüne eklemeniz yeterlidir.

<script>history.scrollRestoration = "manual"</script>

IE tarafından desteklenmemektedir. Tarayıcı Uyumluluğu.


3
Bu, IE / Edge'de mevcut olsaydı en iyi cevap olurdu. Burada uygulanmasına oy verebilirsiniz: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
The Chewy

4
Bu 2019'da gerçekten doğru bir cevap olmalı. Diğer yöntemlerin hiçbiri% 100 çalışmıyor.
Limbo

2
Bunun en iyi çözüm olduğunu doğrulayabilirim. Buradaki diğer çözümler Mobile Safari'de çalışmaz ve kötü olabilir. Bu mükemmel çalışıyor.
user3330820

22

Birkaç başarısızlıktan sonra nihayet hile yapmayı başardım. anzo burada doğrudur, çünkü beforeunloadkullanımı bir kullanıcı sayfayı yeniden yüklediğinde veya bir bağlantıyı tıkladığında sayfanın en üste atlamasını sağlayacaktır. Bunu unloadyapmanın açık yolu da öyle.

$(window).on('unload', function() {
   $(window).scrollTop(0);
});

Javascript yolu (Teşekkürler ProfNandaa ):

window.onunload = function(){ window.scrollTo(0,0); }

DÜZENLEME: 16/07/2015

Atlama sorunu, unloadetkinlikte bile Firefox'ta hala var .


3
Bu çözüm, çözümden çok daha iyidir beforeunloadçünkü yeniden yükleme ve bağlantı tıklamalarında sayfanın üst kısmına atlamayı önler.
BradGreens

1
@BradGreens Modern Chrome ile onunload olayı, kullanıcı beklenmedik bir şekilde diğer sekmelere geçtiğinde de tetikleniyor. onbeforeunload hala geçerli bir çözümdür.
Telvin Nguyen

@TelvinNguyen Bu konuda herhangi bir kaynak verebilir misiniz? Bunu google chrome 72'de test ettim ve hala benim için iyi çalışıyor.
Janaka Dombawela

@JanakaDombawela Söylediklerim: Soruna neden olacak yeni sekmeyi değiştirmek yanlış. Ancak, jQuery 1.9.1 ve jQuery 1.8.3 ile bile onunload'ın bu örnekteki olayın düzgün tetiklenmediğini görebilirsiniz. onunload güvenilir değil. jsfiddle.net/6s4jhdug/3 (1.8.3) jsfiddle.net/frt45ue9 (1.9.1)
Telvin Nguyen

3

İşte daha genel bir yaklaşım. Tarayıcının kaymasını (veya göründüğü gibi üste atlamasını) engellemeye çalışmak yerine, sayfadaki önceki konumu geri yüklerim. Yani, sayfanın geçerli y-ofsetini localStorage'a kaydediyorum ve sayfa yüklendikten sonra bu konuma kaydırıyorum.

function storePagePosition() {
  var page_y = window.pageYOffset;
  localStorage.setItem("page_y", page_y);
}


window.addEventListener("scroll", storePagePosition);


var currentPageY;

try {
  currentPageY = localStorage.getItem("page_y");

  if (currentPageY === undefined) {
    localStorage.setItem("page_y") = 0;
  }

  window.scrollTo( 0, currentPageY );
} catch (e) {
    // no localStorage available
}

2

Sayfanın en üste yüklenmesi için sonuna bir # koyabilirsiniz.

Çok basit olduğu için mobil ve masaüstü tüm tarayıcılarda çalışır.

$(document).ready(function() {
var url = window.location.href;
console.log(url);
if( url.indexOf('#') < 0 ) {
    window.location.replace(url + "#");
} else {
    window.location.replace(url);
}

});

// Bu, sayfayı sonunda bir # ile yükler.


Bunu doğrudan sunucumda denersem, sihir gibi çalışır. Ancak cms'im bana işaretleme hatası veriyor. Bunun ne olduğunu anlayamıyorum.
alice

1
wordpress kullanıyorsanız $ jQuery için değiştirin
Herzlin

2

Bu benim için çalışıyor.

    //Reset scroll top

    history.scrollRestoration = "manual"

    $(window).on('beforeunload', function(){
          $(window).scrollTop(0);
    });

-2

Yapabilmelisin.

Yüklendiğinde, window.location.hashbir değer olup olmadığını kontrol edin . Varsa, karma değeriyle eşleşen bir kimliğe sahip öğeyi alın. Öğenin konumunu bulun (offsetTop / offsetLeft'e özyinelemeli çağrılar) ve ardından bu değerleri window.scrollTo(x, y)yönteme geçirin .

Bu, sayfayı istenen öğeye kaydırmalıdır.


3
Bu, tarayıcıların otomatik kaydırma yapmasını engellemez. Bu soru bununla ilgili.
Haralan Dobrev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.