Tarayıcının geri düğmesini devre dışı bırakın


98

Tarayıcının GERİ Düğmesi (tarayıcılar arasında) nasıl devre dışı bırakılır?


92
Kullanıcılarınızın bilgisayarlarına veya tarayıcılarına sahip değilsiniz.
Instance Hunter

47
+1 Çünkü tarayıcı geri düğmesini devre dışı bırakmanın 'kötü uygulama' olduğunu kabul etmeme rağmen, sorunun kendisini olumsuz oylamak, yanıtlamak ve neden imo'ya gitmek olduğunu açıklamak için bir neden göremiyorum.
ChristopheD

45
Bu soruya neden düşmanca davranıyoruz? Hepimizin bildiği gibi, bu soruyu soran kişi bunun zayıf bir kullanılabilirlik uygulaması olduğunu zaten biliyor ama sadece gereksinimleri takip ediyor ya da belki sadece bir şeyler öğrenmek istiyorlar. Neden bunun varsayımsal bir soru olduğunu varsayıp bu tür şeyler yaparsak bunu nasıl yapacağımızı yanıtlamıyoruz?
thomasrutter

5
Yapma arzusu ne olursa olsun, bazı şeyler asla yapılmamalıdır. Bunun için tartışılamaz bir gereksinim olması, gereksinimlerin hiçbir işi olmayan kişiler tarafından belirlendiğini gösterir ki bu çok daha büyük bir sorundur.
annakata

37
ugh, şimdiye kadarki en harika yorumu yazdım ama yanlışlıkla geri düğmesine bastığımda kaybettim.
Dan Williams

Yanıtlar:


26

Bu soru, bu çok benzer biri ...

Bunun çalışması için önbelleğin süresinin dolmasını sağlamanız gerekir. Aşağıdaki kodu sayfa kodunuzun arkasına yerleştirin.

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)

14
Sayfayı önbelleğe alınamaz hale getirmenin OP'nin istediğini gerçekleştirmediğini unutmayın: geri düğmesini kullanarak sayfaları ziyaret etmeyi devre dışı bırakmak. Bir tarayıcı geri düğmesini kullanırken önbellek yok uygulamasına uysa bile (hangi tarayıcıların AFAIK yapmak zorunda değildir), yine de o sayfayı yeniden yüklemek için bir yol sağlar (genellikle bir uyarı iletişim kutusu gösterdikten sonra). Dolayısıyla, kullanıcılarınızın o sayfaya geri dönmesini gerçekten istemiyorsanız, bu daha kötü olabilir, çünkü o sayfaya yönelik istek, kaynak sunucuya kadar tüm yollarını yapmak zorunda kalacaktır. Sayfanın yeniden ziyaret edildiğini algılamak için sunucu tarafında bir şeye ihtiyacınız olacak. Başlıklar göz ardı edilebilir.
thomasrutter

60

Beklenen tarayıcı davranışını devre dışı bırakmayın.

Sayfalarınızın, kullanıcıların bir veya iki sayfa geri gitme olasılığını ele almasını sağlayın; yazılımlarını sakatlamaya çalışmayın.


6
Teşekkürler dostum, mesele şu ki, bir AJAX uygulaması oluşturuyorsanız, geri düğmesini devre dışı bırakma veya uygulamanızı gözden geçirme ve her olası senaryo için uygun geri eylemi yapma arasındaki maliyet-fayda ödünleri, devre dışı bırakma eğiliminde olabilir. geri düğmesi, ikisinin daha çekici seçeneği.
david.barkhuizen

Jonathan'a katılıyorum, özellikle şu anda internette
dolup taşan

46

JavaScript kullanarak geri düğmesini devre dışı bırakan küçük bir hack buldum. Chrome 10, firefox 3.6 ve IE9'da kontrol ettim:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<title>Untitled Page</title>
<script type = "text/javascript" >
function changeHashOnLoad() {
     window.location.href += "#";
     setTimeout("changeHashAgain()", "50"); 
}

function changeHashAgain() {
  window.location.href += "1";
}

var storedHash = window.location.hash;
window.setInterval(function () {
    if (window.location.hash != storedHash) {
         window.location.hash = storedHash;
    }
}, 50);


</script>
</head>
<body onload="changeHashOnLoad(); ">
Try to hit the back button!
</body>
</html>

Ne yapıyor?

Yorumlardan:

Bu komut dosyası, tarayıcıların URL'deki "#" işaretinden sonra gelen her şeyi göz atma geçmişinin bir parçası olarak dikkate alması gerçeğinden yararlanır. Yaptığı şey şudur: Sayfa yüklendiğinde, URL'ye "1 numara" eklenir. 50 ms sonra "1" kaldırılır. Kullanıcı "geri" düğmesini tıkladığında, tarayıcı URL'yi "1" kaldırılmadan önceki haline değiştirir, ANCAK bu aynı web sayfasıdır, bu nedenle tarayıcının sayfayı yeniden yüklemesine gerek kalmaz. - Yossi Shasho


1
Görünüşe göre bu komut dosyası, sayfa yüklendiğinde URL'ye "#" ekliyor ve her 50 ms'de bir URL'ye 1 ekliyor.
ashes999

6
Bu komut dosyası, tarayıcıların URL'deki "#" işaretinden sonra gelen her şeyi göz atma geçmişinin bir parçası olarak dikkate alması gerçeğinden yararlanır. Yaptığı şey şudur: Sayfa yüklendiğinde, URL'ye "1 numara" eklenir. 50 ms sonra "1" kaldırılır. Kullanıcı "geri" düğmesini tıkladığında, tarayıcı URL'yi "1" kaldırılmadan önceki haline değiştirir, ANCAK bu aynı web sayfasıdır, bu nedenle tarayıcının sayfayı yeniden yüklemesine gerek kalmaz.
Yossi Shasho

1
URL'nin iki kez değiştiğine dikkat edin: Bunu yalnızca uygulamayı gizlemek için yapıyoruz, böylece "1" eklediğimizi kimse görmeyecek. Yani aslında kullanıcı geri tıkladığında, sayfa "1 numara" nı bir an için yeniden ekler ve tekrar kaldırır. BTW - "1" olması gerekmez, herhangi bir dize olabilir.
Yossi Shasho

2
Bununla ilgili sorun, sayfanın her 50 ms'de bir yukarı kaymasıdır. Pencere yüksekliğinden daha büyük bir formunuz varsa, bu, form değerlerini doldurmanızı imkansız hale getirecektir.
3komma14

Çok teşekkürler. Bu, sola ve sağa kaydırmanın mekaniğin bir parçası olduğu JavaScript tabanlı özellikle etkileşimli bir sayfam için çok kullanışlıdır. Bu, kullanıcıları kazara bir sayfaya "geri" götüren Mac OS X'te kaydırma hareketi sorununu ortadan kaldırmaya yardımcı olur (zaten tam olarak kaydırılmışlarsa bunların hepsi yapmak kolaydır).
Iain Collins

34

Diğerleri "bunu yapma" yaklaşımı benimsedi ama bu, posterin sorusuna gerçekten cevap vermiyor. Herkesin bunun kötü bir fikir olduğunu bildiğini varsayalım, ancak yine de nasıl yapıldığını merak ediyoruz ...

Bir kullanıcının tarayıcısındaki geri düğmesini devre dışı bırakamazsınız, ancak kullanıcı geri döndüğünde uygulamanızın bozulmasını (kullanıcının baştan başlamasını gerektiren bir hata mesajı görüntüler) olmasını sağlayabilirsiniz.

Bunu yapmak için gördüğüm bir yaklaşım, uygulama içindeki her URL'ye ve her formda bir belirteç iletmektir. Jeton her sayfada yeniden oluşturulur ve kullanıcı yeni bir sayfa yüklediğinde, önceki sayfalardaki tüm simgeler geçersiz kılınır.

Kullanıcı bir sayfa yüklediğinde, sayfa yalnızca doğru jetonun (önceki sayfadaki tüm bağlantılara / formlara verilen) ona geçirilip geçirilmediğini gösterecektir.

Bankamın sağladığı çevrimiçi bankacılık uygulaması şöyle. Geri düğmesini hiç kullanırsanız, daha fazla bağlantı çalışmaz ve daha fazla sayfa yeniden yükleme yapılamaz - bunun yerine geri dönemeyeceğinizi ve baştan başlamanız gerektiğini söyleyen bir bildirim görürsünüz.


1
Bankam farklı bir yaklaşım benimsiyor - seansı tamamen sonlandırıyor. Geri düğmesini kullanmak oturumu kapatmakla eşdeğerdir.
RobG

Bu aynı yaklaşım gibi geliyor. Geri döndüğünüzü ve bir hata durumu oluşturduğunuzu tespit ediyorlar.
thomasrutter

Ayrıca joomla jeton çözümü etrafında çalışır, her sayfa ve her formda bir jeton oluşturulur, aslında bu uygulamayla ilgili bazı sorunlar vardır, örneğin "bir kullanıcı bir sayfada çok fazla kaldığında ve simgesinin süresi dolduğunda"
Matteo Bononi 'peorthyr'

1
Beni yanlış anlamayın, bu uygulamada BİRÇOK sorun var. Tavsiye etmiyorum, sadece normal olarak nasıl elde edildiğini söylüyorum. Önceki sayfadan beklenen bağlantılardan birini izlemediğinizi tespit etmek için sayfalar arasında benzersiz belirteçler geçirirler ve ardından oturumu sonlandırır veya bir hata gösterirler. Geri düğmesini kırar, sekmeli taramayı bozar, yer imlerini ve / veya paylaşım bağlantılarını ve daha fazlasını bozar - ve dahası, herhangi bir sorunu gerçekten çözmez.
thomasrutter

Eğer kullanıcı geri düğmesini kullanmayı denediğinde sorun bilginin kaybolması veya kesilmesi ise, geri düğmesini devre dışı bırakmak daha istenen bir yaklaşım olacaktır.
PoloHoleSet

10

Cevabı kendim ararken, "En İyi Uygulama" .... modası geçmiş ... Tıpkı tarayıcılar gibi. (Gerçekten tarayıcılar çirkin fosillerdir)

En iyi / en güvenli çözüm, tarayıcıların, kullanıcının sayfaya arayüzü kontrol etme yeteneği verebileceği bir yöntem / istek uygulamasıdır.

Neden? Çünkü şu anki projem için% 100 JavaScript oluşturulmuş ve kontrol edilen bir arayüz oluşturuyorum .. Ve sayfa değişikliği olmadığı için geri düğmesinin projemde yeri yok. (Yani çok hızlı ve yenileme nedeniyle sayfa yanıp sönmüyor .. Tıpkı gerçek bir uygulama gibi!)

Arayüzü "highjack" yeteneğinin neden orada olmadığını biliyorum ve bunu anlıyorum. Ancak en azından tarayıcıdan talep etme yeteneğine sahip olmalıyız! Şimdi bu, highjack tehlikeleri olmadan gerçekten "en iyi uygulama" olurdu.

Ama tarayıcılar tarayıcılar .. Bu konuda çıkabilecek bir şey olmasını beklemiyorum.


1
% 100 katılmıyorum, ancak bu işlevsellik web geliştiricilerinin% 99'u için harika olurken, kalan% 1'i bu işlevi kötüye kullanır, bir web sitesinin interneti kullanma yeteneğinizi kontrol etmesine izin vermek çok tehlikelidir, bence etki alanları arası yönlendirme komut dosyasının yasaklanması veya komut dosyasının sadece bu tür bir kötüye kullanım nedeniyle çalıştırılmasına izin
verilip

@MikeT - Kendi özel uygulama sayfalarımda gezinirken bir "geri" düğmesini devre dışı bırakmak, herhangi birinin İnternet'i kullanmasını nasıl engeller?
PoloHoleSet

@PoloHoleSet, tarayıcı geri düğmesini devre dışı bırakma yeteneğiniz varsa herkes de öyle, tek ihtiyacınız olan tek şey sizi gitmek istemediğiniz bir sayfaya göndermek için bir yönlendirme ve tarayıcıdaki gezinme kontrollerinizi nasıl devre dışı bırakabilirlerse kaçar mısın Eminim var olmayan virüsü kaldırmak için virüslerini yüklemenizi isteyen "bir virüs sayfanız var" ile karşılaşmışsınızdır, şimdi ayrılmanızı gerçekten engelleyebilecekleri siteyi hayal edin
MikeT

@MikeT - Navigasyon penceresine başka herhangi bir url girebilirim, bir sekmeyi kapatabilirim, javascript'i devre dışı bırakabilirim. Mesele birisinin CAN olup olmadığı değil, çünkü sen yapabilirsin, ben yapabilirim, herkes yapabilir. Politika gereği, insanlar eğer yapabilirsen, YAPMAMANIZ GEREKENLER diyorlar. Bir tarayıcıyı nasıl tasarlayacağımızdan bahsetmiyoruz, bir uygulamayı nasıl programladığımızdan bahsediyoruz.
PoloHoleSet

@PoloHoleSet Navigasyonu kilitleyecekseniz, tarayıcı geçmişi ve yazılan url'ler kullanıcılara iş akışınızı atlamanın bir yolunu sağlayacağından, yalnızca geri düğmesinden daha fazlasını kilitlemeniz gerekir. ve dediğim gibi, sizin veya benim ne yapacağımızdan değil kötü niyetli unsurdan bahsediyoruz, kötü niyetli bir web sitesinin tarayıcınızın kontrolünü ele geçirmesini önlemenin tek yolu tarayıcınızdaki tüm js'leri devre dışı bırakmaksa, o zaman interneti bozmuşsunuzdur. modern web, içerik sağlamak için komut dosyalarına güveniyor, bu da benim açımdan, kullanıcılarınız üzerinde bu kadar fazla kontrole sahip olmak istiyorsanız, iş
akışınıza

4

Aynı soruyu arıyordum ve bir sitede aşağıdaki kodu buldum. Burada paylaşmayı düşündüm:

function noBack()
{
   window.history.forward()
}
noBack();
window.onload = noBack;
window.onpageshow = function(evt){ if(evt.persisted) noBack(); }
window.onunload = function(){ void(0); }

Ancak, yukarıdaki kullanıcılar tarafından belirtildiği gibi, bu asla iyi bir uygulama değildir ve tüm nedenlerden dolayı kaçınılmalıdır.


2
neden kaçınılması gerektiğini söylerseniz iyi olur.
Chris Snow

Anladığım kadarıyla, teknik olarak birinin tarayıcısında Geri düğmesini devre dışı bırakamazsınız, yalnızca düğmenin kullanılmaması veya aynı sayfayı yüklemeye devam etmesi için yapabilirsiniz. JS aracılığıyla yapmak yerine, sunucu tarafı kodunu kullanın ve Geri düğmesini kullanmasına gerek olmayan uygun mantığı kullanın. Aynı sayfayı yeniden yüklemek veya özel mesaj göstermek gibi alternatif eylemler kullanılmalıdır.
user704988

2

İstemci tarafı teknolojiye güvenirseniz, bu atlatılabilir. Örneğin, Javascript devre dışı bırakılabilir. Veya kullanıcı, kısıtlamalarınızı aşmak için bir JS betiği çalıştırabilir.

Tahminimce bunu yalnızca kullanıcı oturumunu sunucu tarafında izleyerek ve kullanıcıyı / tarayıcıyı gerekli sayfaya yeniden yönlendirerek (Server.Transfer'da olduğu gibi, Response.Redirect'de olduğu gibi) yapabilirsiniz.


2
<body onLoad="if(history.length>0)history.go(+1)">

2

Birkaç farklı uygulama var. IE için bir flash çözümü ve bazı iframe / frame çözümleri var. Bunu kontrol et

http://www.contentwithstyle.co.uk/content/fixing-the-back-button-and-enunning-bookmarking-for-ajax-apps

BTW: Bir geri düğmesini devre dışı bırakmak (veya en azından 1 adımı engellemek) için pek çok geçerli neden vardır - yukarıdaki makalede tartışılan karma çözümünü uygulayan bir örnek olarak gmail'e bakın.

Google "ajax geri düğmesini nasıl kırdı" ve kullanıcı testleri ve geri düğmesini devre dışı bırakmanın geçerliliği hakkında birçok makale bulacaksınız.


Facebook'un yeni fotoğraf görüntüleyicisine de göz atın. Geri düğmesinin, tarayıcı varsayılanını yapmak yerine sizi bir fotoğrafı (istediğiniz şeydir) geri götürdüğüne dikkat edin
DallinDyer

2

Ben de aynı sorunu yaşadım, bu Java komut dosyası işlevini baş etiketinde veya içinde kullanın,% 100 iyi çalışıyor, geri dönmenize izin vermezdi.

 <script type = "text/javascript" >
      function preventBack(){window.history.forward();}
        setTimeout("preventBack()", 0);
        window.onunload=function(){null};
    </script>

1

Bu kodu deneyin. Benim için çalıştı. Temel olarak, URL'ye "1" ekleyerek yakın geçmiş sayfasını değiştiren sayfa yüklenir yüklenmez hash'i değiştirir. Yani geri düğmesine bastığınızda, her seferinde aynı sayfaya yönlendiriyor.

 <script type="text/javascript">
    var storedHash = window.location.hash;
    function changeHashOnLoad() { window.location.hash = "1";}
    window.onhashchange = function () {
        window.location.hash = storedHash;
    }
</script>

<body onload="changeHashOnLoad(); ">

</bod>

0

Uygun son kullanma tarihlerine ve önbelleğe alma başlıklarına sahip gönderiler kullanmalısınız.


Bunun neden işe yaramadığını öğrenmek için bu cevap hakkındaki yorumuma bakın .
thomasrutter

0

Tarayıcı geri düğmesini devre dışı bırakmaya çalışmak yerine, onu desteklemek daha iyidir. .NET 3.5, tarayıcı geri (ve ileri) düğmelerini çok iyi idare edebilir. Google ile arama yapın: "Scriptmanager EnableHistory". Hangi kullanıcı eylemlerinin tarayıcının geçmişine bir girdi ekleyeceğini (ScriptManager -> AddHistoryPoint) ve ASP.NET uygulamanız, kullanıcı tarayıcı Geri / İleri düğmelerini her tıklattığında bir olay alır. Bu, bilinen tüm tarayıcılar için çalışacak


0

Küresel olarak, geri düğmesini devre dışı bırakmak gerçekten kötü bir uygulamadır. Ancak bazı durumlarda geri düğmesi işlevi bir anlam ifade etmiyor.

Sayfalar arasında istenmeyen gezinmeyi önlemenin bir yolu:

Baş sayfa (dosya top.php):

<?php
    session_start();
    $_SESSION[pid]++;
    echo "top page $_SESSION[pid]";
    echo "<BR><a href='secondary.php?pid=$_SESSION[pid]'>secondary page</a>";
?>

İkincil sayfa (dosya secondary.php):

<?php
    session_start();
    if ($_SESSION[pid] != $_GET[pid]) 
        header("location: top.php");
    else {
        echo "secondary page $_SESSION[pid]";
        echo "<BR><a href='top.php'>top</a>";
    }
?>

Bunun etkisi, kendi bağlantılarınızı kullanarak üst sayfadan ikincil sayfaya ve geri (örneğin, İptal) gitmenize izin vermektir. Ancak, en üst sayfaya döndükten sonra, tarayıcı geri düğmesinin ikincil sayfaya gitmesi engellenir.


0

Daha önce de aynı durumla karşılaştım ... ve hiç yardım almadım. Bunları dene belki bunlar senin için işe yarar

giriş sayfası <head>etiketinde:

<script type="text/javascript">
    window.history.forward();
</script>

Oturumu Kapat Düğmesinde Bunu yaptım:

protected void Btn_Logout_Click(object sender, EventArgs e)      
{
    connObj.Close();
    Session.Abandon();
    Session.RemoveAll();
    Session.Clear();
    HttpContext.Current.Session.Abandon();
}

ve giriş sayfasında şu şekilde Kullanıcı Adı metin kutusuna odaklanıyorum:

protected void Page_Load(object sender, EventArgs e)
{
    _txtUsername.Focus();
}

umarım bu yardımcı olur ... :) birisi bana bu sayfayı nasıl düzenleyeceğimi öğretir ...


a) cevabınızı düzenleyin b) soru işaretine tıklayın c) gelişmiş yardıma tıklayın d) okuyun ve uygulayın :-) Ayrıca, ctrl-k'nın seçilen bloğu kod olarak açmak / biçimlendirmek için un / girintisini açtığını unutmayın. Ayrıca formatlayıcı sekmeleri iyi
işleyemiyor

0

Öğeleri düzenlerken / silerken sayfanın beklenmedik bir şekilde yeniden yönlendirilmemesi için Web uygulamanızdaki silme ve geri alma tuşlarını yumuşak bir şekilde bastırmanız gerekiyorsa, şu kodu kullanabilirsiniz:

window.addEventListener('keydown', function(e) {
  var key = e.keyCode || e.which;
  if (key == 8 /*BACKSPACE*/ || key == 46/*DELETE*/) {
    var len=window.location.href.length;
    if(window.location.href[len-1]!='#') window.location.href += "#";
  }
},false);

0

Bu kodu deneyin. Bu kodu ana sayfada uygulamanız yeterlidir ve tüm sayfalarda sizin için çalışacaktır.

<script type="text/javascript">
    window.onload = function () {
        noBack();
    }
    function noBack() {
        window.history.forward();
    }
</script>
<body  onpageshow="if (event.persisted) noBack();">
</body>

0

Sorun Yossi Shasho 'ın Kod sayfası her 50 ms üstüne kaydırma olmasıdır. Ben de bu kodu değiştirdim. Artık tüm modern tarayıcılarda, IE8 ve üzeri sürümlerde sorunsuz çalışıyor

var storedHash = window.location.hash;
function changeHashOnLoad() {
    window.location.href += "#";
    setTimeout("changeHashAgain()", "50");
}

function changeHashAgain() {
    window.location.href += "1";
}

function restoreHash() {
    if (window.location.hash != storedHash) {
        window.location.hash = storedHash;
    }
}

if (window.addEventListener) {
    window.addEventListener("hashchange", function () {
        restoreHash();
    }, false);
}
else if (window.attachEvent) {
    window.attachEvent("onhashchange", function () {
        restoreHash();
    });
}
$(window).load(function () { changeHashOnLoad(); });

0

Bu bizim için işe yaradı gibi görünüyor.

history.pushState(null, null, $(location).attr('href'));
window.addEventListener('popstate', function () {
    history.pushState(null, null, $(location).attr('href'));
});

0
<script>
    $(document).ready(function() {
        function disableBack() { window.history.forward() }

        window.onload = disableBack();
        window.onpageshow = function(evt) { if (evt.persisted) disableBack() }
    });
</script>
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.