Nonaktifkan tombol kembali browser

98

Bagaimana cara menonaktifkan Tombol KEMBALI browser (lintas browser)?

priyanka.sarkar
sumber
92
Anda tidak memiliki komputer pengguna atau browser mereka.
Pemburu Instance
47
+1 Karena meskipun saya setuju bahwa menonaktifkan tombol kembali browser adalah 'praktik yang buruk', saya tidak melihat alasan untuk merendahkan pertanyaan itu sendiri, menjawab dan menjelaskan mengapa cara yang harus dilakukan adalah imo.
ChristopheD
45
Mengapa kita memusuhi pertanyaan ini? Sejauh yang kami tahu, orang yang mengajukan pertanyaan ini sudah tahu bahwa ini adalah praktik kegunaan yang buruk tetapi hanya mengikuti persyaratan, atau mungkin mereka hanya ingin mempelajari sesuatu. Mengapa kita tidak berpura-pura ini adalah pertanyaan hipotetis, dan menjawab bagaimana kita akan melakukannya JIKA kita harus melakukan hal semacam itu?
thomasrutter
5
Beberapa hal tidak boleh dilakukan, terlepas dari keinginan untuk melakukannya. Memiliki persyaratan yang tidak dapat dinegosiasikan untuk ini secara instan mengatakan bahwa persyaratan tersebut ditetapkan oleh orang-orang yang tidak memiliki bisnis yang mengaturnya, yang merupakan masalah yang jauh lebih besar.
annakata
37
ugh, saya menulis komentar paling keren yang pernah ada, tapi hilang saat saya tidak sengaja menekan tombol kembali.
Dan Williams

Jawaban:

26

Pertanyaan ini sangat mirip dengan ini satu ...

Anda perlu memaksa cache kedaluwarsa agar ini berfungsi. Tempatkan kode berikut pada kode halaman Anda di belakang.

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
RSolberg
sumber
14
Perhatikan bahwa membuat halaman tidak dapat disimpan dalam cache tidak mencapai apa yang diinginkan OP: menonaktifkan halaman yang dikunjungi menggunakan tombol kembali. Sekalipun browser mematuhi no-cache saat menggunakan tombol kembali (browser mana yang tidak diwajibkan untuk melakukan AFAIK), browser tetap menyediakan cara untuk memuat ulang halaman tersebut (biasanya setelah menampilkan dialog peringatan). Jadi, jika Anda benar-benar tidak ingin pengguna Anda kembali ke halaman itu, ini mungkin lebih buruk, karena permintaan untuk halaman itu HARUS sampai ke server asal. Anda akan memerlukan sesuatu di sisi server untuk mendeteksi bahwa halaman tersebut telah dikunjungi kembali. Header dapat diabaikan.
thomasrutter
60

Jangan nonaktifkan perilaku browser yang diharapkan.

Buat halaman Anda menangani kemungkinan pengguna kembali ke satu atau dua halaman; jangan mencoba untuk melumpuhkan perangkat lunak mereka.

Jonathan Fingland
sumber
6
Terima kasih kawan, masalahnya adalah jika Anda membuat aplikasi AJAX, kompromi biaya-manfaat antara menonaktifkan tombol kembali, atau melalui aplikasi Anda dan mengerjakan tindakan mundur yang sesuai untuk setiap skenario yang mungkin, mungkin cenderung untuk menonaktifkan tombol kembali menjadi pilihan yang lebih menarik dari keduanya.
david.barkhuizen
Saya setuju dengan Jonathan, terutama dengan banjirnya iklan malware redirect yang saat ini membanjiri internet, mereka telah menyalahgunakan sistem peringatan untuk membuat halaman mereka menjadi sulit tanpa memberi mereka kemampuan untuk benar-benar mengunci Anda ke halaman mereka
MikeT
46

Saya datang dengan sedikit peretasan yang menonaktifkan tombol kembali menggunakan JavaScript. Saya memeriksanya di chrome 10, firefox 3.6 dan IE9:

<!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>

Apa yang dilakukannya?

Dari Komentar:

Skrip ini memanfaatkan fakta bahwa browser mempertimbangkan apa pun yang muncul setelah tanda "#" di URL sebagai bagian dari riwayat browsing. Apa yang dilakukannya adalah: Saat halaman dimuat, "# 1" ditambahkan ke URL. Setelah 50 md, "1" dihapus. Ketika pengguna mengklik "kembali", browser mengubah URL kembali seperti sebelum "1" dihapus, TAPI - itu adalah halaman web yang sama, jadi browser tidak perlu memuat ulang halaman. - Yossi Shasho

Yossi Shasho
sumber
1
Sepertinya skrip ini menambahkan "#" ke URL saat halaman dimuat, dan setiap 50 md, ini menambahkan 1 ke URL.
ashes999
6
Skrip ini memanfaatkan fakta bahwa browser mempertimbangkan apa pun yang muncul setelah tanda "#" di URL sebagai bagian dari riwayat browsing. Apa yang dilakukannya adalah: Saat halaman dimuat, "# 1" ditambahkan ke URL. Setelah 50 md, "1" dihapus. Ketika pengguna mengklik "kembali", browser mengubah URL kembali seperti sebelum "1" dihapus, TAPI - itu adalah halaman web yang sama, jadi browser tidak perlu memuat ulang halaman.
Yossi Shasho
1
perhatikan bahwa URL berubah dua kali: Kami hanya melakukan ini untuk menyamarkan penerapan, jadi tidak ada yang akan melihat bahwa kami menambahkan "1". Jadi sebenarnya ketika pengguna mengklik kembali, halaman menambahkan kembali "# 1" sejenak dan menghapusnya lagi. BTW - tidak harus "1", bisa berupa string apa saja.
Yossi Shasho
2
Masalahnya adalah halaman bergulir ke atas setiap 50 md. Jika Anda memiliki formulir lebih besar dari tinggi jendela, ini akan membuat tidak mungkin untuk mengisi nilai formulir.
3komma14
Terima kasih banyak. Ini sangat berguna untuk halaman interaktif berbasis JavaScript yang saya miliki, di mana menggulir ke kiri dan kanan adalah bagian dari mekanik. Ini membantu menghilangkan masalah gerakan gulir di Mac OS X yang membuat pengguna "kembali" halaman secara tidak sengaja (semua mudah dilakukan jika mereka sudah menggulir seluruhnya).
Iain Collins
34

Orang lain telah mengambil pendekatan untuk mengatakan "jangan lakukan ini" tetapi itu tidak benar-benar menjawab pertanyaan pembuat poster. Anggap saja semua orang tahu ini adalah ide yang buruk, tetapi kita ingin tahu bagaimana caranya ...

Anda tidak dapat menonaktifkan tombol kembali pada browser pengguna, tetapi Anda dapat membuatnya sehingga aplikasi Anda rusak (menampilkan pesan kesalahan, mengharuskan pengguna untuk memulai kembali) jika pengguna kembali.

Salah satu pendekatan yang saya lihat untuk melakukan ini adalah meneruskan token pada setiap URL dalam aplikasi, dan dalam setiap formulir. Token dibuat ulang di setiap halaman, dan setelah pengguna memuat halaman baru, token apa pun dari halaman sebelumnya menjadi tidak valid.

Saat pengguna memuat halaman, halaman hanya akan ditampilkan jika token yang benar (yang diberikan ke semua link / formulir di halaman sebelumnya) telah diberikan.

Aplikasi perbankan online yang disediakan bank saya seperti ini. Jika Anda menggunakan tombol kembali sama sekali, tidak ada lagi tautan yang akan berfungsi dan tidak ada lagi pemuatan ulang halaman yang dapat dibuat - alih-alih Anda melihat pemberitahuan yang memberi tahu Anda bahwa Anda tidak dapat kembali, dan Anda harus memulai kembali.

thomasrutter
sumber
1
Bank saya mengambil pendekatan yang berbeda - ini menghentikan sesi sepenuhnya. Menggunakan tombol kembali sama dengan logout.
RobG
Kedengarannya seperti pendekatan yang sama. Mereka mendeteksi bahwa Anda telah kembali dan membuat kondisi kesalahan.
thomasrutter
juga joomla bekerja di sekitar solusi token, token dihasilkan oleh setiap halaman dan setiap bentuk, sebenarnya ada beberapa masalah tentang praktik ini, seperti "ketika pengguna tinggal terlalu banyak di halaman dan
tokennya
1
Jangan salah paham, ada BANYAK masalah dengan praktik ini. Saya tidak merekomendasikannya, saya hanya mengatakan bagaimana hal itu biasanya dicapai. Mereka meneruskan token unik antar halaman untuk mendeteksi bahwa Anda belum mengikuti salah satu link yang diharapkan dari halaman sebelumnya, dan kemudian menghentikan sesi atau menampilkan kesalahan. Itu merusak tombol kembali, itu merusak penjelajahan tab, itu merusak bookmark dan / atau berbagi tautan, dan banyak lagi - dan terlebih lagi, itu tidak benar-benar menyelesaikan masalah apa pun.
thomasrutter
jika masalahnya adalah informasi hilang atau rusak jika pengguna mencoba menggunakan tombol kembali, maka menonaktifkan tombol kembali akan menjadi pendekatan yang lebih diinginkan.
PoloHoleSet
10

Sementara saya sendiri sedang mencari jawabannya, "Praktik Terbaik" adalah .... usang ... Sama seperti browser. (Sungguh, browser adalah fosil yang jelek)

Solusi terbaik / teraman adalah browser menerapkan metode / permintaan di mana pengguna dapat memberikan halaman kemampuan untuk mengontrol antarmuka.

Mengapa? Karena untuk proyek saya saat ini, saya sedang membangun antarmuka yang 100% dibangun dan dikendalikan JavaScript .. Dan tombol kembali tidak memiliki tempat di proyek saya karena tidak ada perubahan halaman. (Yaitu sangat cepat dan tidak ada halaman yang berkedip karena penyegaran .. Sama seperti aplikasi asli!)

Saya tahu mengapa kemampuan untuk melakukan "highjack" pada antarmuka tidak ada, dan saya memahaminya. Tapi setidaknya kita harus memiliki kemampuan untuk memintanya dari browser! Sekarang itu benar-benar akan menjadi "praktik terbaik" tanpa bahaya highjack.

Tapi browser menjadi browser .. Saya tidak mengharapkan sesuatu yang keluar terjadi dalam hal ini.

StellarDevil
sumber
1
100% tidak setuju, meskipun fungsi ini akan luar biasa untuk 99% pengembang web, yang menyisakan 1% sisanya yang akan menyalahgunakan fungsi ini, terlalu berbahaya untuk mengizinkan situs web mengontrol kemampuan Anda untuk menggunakan internet, menurut pendapat saya skrip pengalihan lintas domain perlu dilarang atau mengizinkan untuk mengonfirmasi apakah skrip diizinkan untuk dijalankan hanya karena jenis penyalahgunaan ini
MikeT
@MikeT - Bagaimana menonaktifkan tombol "kembali" saat menavigasi pada halaman aplikasi khusus saya akan menghambat kemampuan siapa pun untuk menggunakan Internet?
PoloHoleSet
@PoloHoleSet jika Anda memiliki kemampuan untuk menonaktifkan tombol kembali browser, begitu juga semua orang, yang Anda butuhkan hanyalah satu pengalihan untuk mengirim Anda ke halaman yang tidak ingin Anda buka dan jika mereka dapat menonaktifkan kontrol navigasi Anda di browser caranya apakah kamu melarikan diri? Saya yakin Anda telah menemukan "halaman Anda memiliki virus" di mana mereka meminta Anda untuk menginstal virus mereka untuk menghapus virus yang tidak ada. Sekarang bayangkan situs di mana mereka benar-benar dapat mencegah Anda keluar
MikeT
@MikeT - Saya dapat memasukkan url lain di jendela navigasi, saya dapat menutup tab, saya dapat menonaktifkan javascript. Intinya bukanlah apakah seseorang BISA, karena Anda bisa, saya bisa, siapa pun bisa. Sebagai masalah kebijakan, orang mengatakan bahwa Anda TIDAK HARUS, jika bisa. Kami tidak berbicara tentang bagaimana kami mendesain browser, kami berbicara tentang bagaimana kami memprogram aplikasi.
PoloHoleSet
@PoloHoleSet jika Anda akan mengunci navigasi, Anda perlu mengunci lebih dari sekedar tombol kembali, karena riwayat browser dan url yang diketik juga akan memberi pengguna cara untuk melewati alur kerja Anda. dan seperti yang saya katakan, kami tidak berbicara tentang apa yang Anda atau saya akan lakukan tetapi elemen berbahaya, jika satu-satunya cara untuk mencegah situs web berbahaya mengambil kendali browser Anda adalah dengan menonaktifkan semua js di browser Anda, maka Anda telah merusak internet sebagai web modern mengandalkan skrip untuk menyediakan konten yang merupakan maksud saya, jika Anda ingin banyak kontrol atas pengguna Anda membuat aplikasi untuk melayani alur kerja Anda
MikeT
4

Saya sedang mencari pertanyaan yang sama dan saya menemukan kode berikut di sebuah situs. Berpikir untuk membagikannya di sini:

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

Namun seperti yang dicatat oleh pengguna di atas, ini bukanlah praktik yang baik dan harus dihindari karena semua alasan.

pengguna704988
sumber
2
alangkah baiknya jika Anda dapat menyatakan alasan mengapa hal itu harus dihindari.
Chris Snow
Sesuai pemahaman saya, Anda secara teknis tidak dapat menonaktifkan tombol Kembali di browser seseorang, Anda hanya dapat membuatnya agar tombol tersebut tidak tersedia atau terus memuat halaman yang sama. Daripada melakukannya melalui JS, gunakan kode sisi server dan gunakan logika yang tepat yang tidak perlu menggunakan tombol Kembali. Tindakan alternatif seperti memuat ulang halaman yang sama atau menampilkan pesan kustom harus digunakan.
pengguna704988
2

Jika Anda mengandalkan teknologi sisi klien, itu dapat dielakkan. Javascript mungkin dinonaktifkan, misalnya. Atau pengguna mungkin menjalankan skrip JS untuk mengatasi batasan Anda.

Dugaan saya adalah Anda hanya dapat melakukan ini dengan pelacakan sisi server dari sesi pengguna, dan mengarahkan (seperti di Server.Transfer, bukan Response.Redirect) pengguna / browser ke halaman yang diperlukan.

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

Ada beberapa implementasi yang berbeda. Ada solusi flash dan beberapa solusi iframe / frame untuk IE. Lihat ini

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

BTW: Ada banyak alasan yang valid untuk menonaktifkan (atau setidaknya mencegah 1 langkah) tombol kembali - lihat gmail sebagai contoh yang menerapkan solusi hash yang dibahas di artikel di atas.

Google "bagaimana ajax mematahkan tombol kembali" dan Anda akan menemukan banyak artikel tentang pengujian pengguna dan validitas menonaktifkan tombol kembali.

DallinDyer
sumber
Lihat juga penampil foto baru Facebook. Perhatikan bahwa tombol kembali membawa Anda kembali ke foto (yang Anda inginkan) alih-alih melakukan default peramban
DallinDyer
2

Saya juga memiliki masalah yang sama, menggunakan fungsi skrip Java ini pada tag kepala atau di, 100% berfungsi dengan baik, tidak akan membiarkan Anda kembali.

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

Coba kode ini. Bekerja untuk saya. Ini pada dasarnya mengubah hash segera setelah halaman memuat yang mengubah halaman riwayat terbaru dengan menambahkan "1" pada URL. Jadi ketika Anda menekan tombol kembali, itu mengarahkan ke halaman yang sama setiap saat.

 <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>
P. Shrestha
sumber
0

Anda harus menggunakan posting dengan kedaluwarsa dan header cache yang tepat.

epascarello.dll
sumber
Lihat komentar saya tentang jawaban ini untuk mengapa itu tidak berhasil.
thomasrutter
0

Daripada mencoba menonaktifkan tombol kembali browser, lebih baik mendukungnya. .NET 3.5 dapat menangani tombol mundur (dan maju) browser dengan sangat baik. Cari dengan Google: "Scriptmanager EnableHistory". Anda dapat mengontrol tindakan pengguna mana yang akan menambahkan entri ke riwayat browser (ScriptManager -> AddHistoryPoint) dan aplikasi ASP.NET Anda menerima peristiwa setiap kali pengguna mengklik tombol Mundur / Maju di browser. Ini akan bekerja untuk semua browser yang dikenal

Corne
sumber
0

Secara global, menonaktifkan tombol kembali memang praktik yang buruk. Namun, dalam situasi tertentu, fungsi tombol kembali tidak masuk akal.

Berikut salah satu cara untuk mencegah navigasi yang tidak diinginkan antar halaman:

Halaman atas (file top.php):

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

Halaman kedua (file 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>";
    }
?>

Efeknya adalah memungkinkan navigasi dari halaman atas ke depan ke halaman sekunder dan kembali (misalnya Batal) menggunakan link Anda sendiri. Namun, setelah kembali ke halaman atas, tombol kembali browser dicegah untuk menavigasi ke halaman sekunder.

Anono Mouser
sumber
0

Bahkan saya menghadapi situasi yang sama sebelumnya ... dan tidak mendapat bantuan. coba hal-hal ini mungkin ini akan berhasil untuk Anda

di <head>tag halaman login :

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

di Tombol Keluar Saya melakukan ini:

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

dan pada halaman login saya telah memfokuskan pada kotak teks Username seperti ini:

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

semoga ini membantu ... :) seseorang tolong ajari saya cara mengedit halaman ini ...

Robin
sumber
a) edit jawaban Anda b) klik tanda tanya c) klik pada bantuan lanjutan d) baca dan terapkan :-) Juga perhatikan bahwa ctrl-k un / indentasi blok yang dipilih ke un / format sebagai kode. Selain itu, pemformat tidak dapat menangani tab dengan baik (mungkin bukan masalah di sini)
kleopatra
0

JIKA Anda perlu menekan dengan lembut tombol delete dan backspace di aplikasi Web Anda, sehingga ketika mereka mengedit / menghapus item, halaman tidak dialihkan secara tidak terduga, Anda dapat menggunakan kode ini:

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);
nvd_ai
sumber
0

Coba kode ini. Anda hanya perlu menerapkan kode ini di halaman master dan ini akan berfungsi untuk Anda di semua halaman

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

Masalah dengan Yossi Shasho Kode 's adalah bahwa halaman tersebut bergulir ke atas setiap 50 ms. Jadi saya telah memodifikasi kode itu. Sekarang berfungsi dengan baik di semua browser modern, IE8 dan yang lebih baru

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(); });
Wisnu TS
sumber
0

Ini sepertinya berhasil untuk kami.

history.pushState(null, null, $(location).attr('href'));
window.addEventListener('popstate', function () {
    history.pushState(null, null, $(location).attr('href'));
});
jgabb.dll
sumber
0
<script>
    $(document).ready(function() {
        function disableBack() { window.history.forward() }

        window.onload = disableBack();
        window.onpageshow = function(evt) { if (evt.persisted) disableBack() }
    });
</script>
chetan
sumber