Làm cách nào để tắt Nút QUAY LẠI của trình duyệt (trên các trình duyệt)?
Làm cách nào để tắt Nút QUAY LẠI của trình duyệt (trên các trình duyệt)?
Câu trả lời:
Câu hỏi này rất giống với này một ...
Bạn cần buộc bộ nhớ cache hết hạn để điều này hoạt động. Đặt mã sau trên mã trang của bạn phía sau.
Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
Không vô hiệu hóa hành vi trình duyệt mong đợi.
Làm cho các trang của bạn xử lý khả năng người dùng quay lại một hoặc hai trang; đừng cố gắng làm tê liệt phần mềm của họ.
Tôi đã nghĩ ra một thủ thuật nhỏ giúp vô hiệu hóa nút quay lại bằng JavaScript. Tôi đã kiểm tra nó trên chrome 10, firefox 3.6 và 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>
Nó đang làm gì vậy?
Từ nhận xét:
Tập lệnh này thúc đẩy thực tế là các trình duyệt coi bất kỳ thứ gì xuất hiện sau dấu "#" trong URL là một phần của lịch sử duyệt web. Những gì nó làm là thế này: Khi trang tải, "# 1" được thêm vào URL. Sau 50ms, "1" bị loại bỏ. Khi người dùng nhấp vào "quay lại", trình duyệt sẽ thay đổi URL trở lại như trước khi "1" bị xóa, NHƯNG - đó là cùng một trang web, vì vậy trình duyệt không cần tải lại trang. - Yossi Shasho
Những người khác đã thực hiện cách tiếp cận để nói "đừng làm điều này" nhưng điều đó không thực sự trả lời câu hỏi của người đăng. Hãy cứ cho rằng mọi người đều biết đây là một ý tưởng tồi, nhưng dù sao thì chúng tôi vẫn tò mò về cách nó được thực hiện ...
Bạn không thể tắt nút quay lại trên trình duyệt của người dùng, nhưng bạn có thể làm cho nó để ứng dụng của bạn bị hỏng (hiển thị thông báo lỗi, yêu cầu người dùng bắt đầu lại) nếu người dùng quay lại.
Một cách tiếp cận mà tôi đã thấy để thực hiện việc này là chuyển mã thông báo trên mọi URL trong ứng dụng và trong mọi biểu mẫu. Mã thông báo được tạo lại trên mọi trang và khi người dùng tải trang mới, bất kỳ mã thông báo nào từ các trang trước đó sẽ bị vô hiệu.
Khi người dùng tải một trang, trang sẽ chỉ hiển thị nếu mã thông báo chính xác (đã được cấp cho tất cả các liên kết / biểu mẫu trên trang trước đó) được chuyển đến trang đó.
Ứng dụng ngân hàng trực tuyến mà ngân hàng của tôi cung cấp là như thế này. Nếu bạn hoàn toàn sử dụng nút quay lại, sẽ không có thêm liên kết nào hoạt động và không thể tải lại trang nữa - thay vào đó, bạn sẽ thấy một thông báo cho biết rằng bạn không thể quay lại và bạn phải bắt đầu lại.
Trong khi tôi đang tự tìm câu trả lời, thì "Phương pháp hay nhất" đã .... lỗi thời ... Cũng giống như các trình duyệt. (Thực sự thì các trình duyệt là những hóa thạch xấu xí)
Giải pháp tốt nhất / an toàn nhất dành cho các trình duyệt để triển khai một phương thức / yêu cầu mà người dùng có thể cấp cho trang khả năng kiểm soát giao diện.
Tại sao? Bởi vì đối với dự án hiện tại của tôi, tôi đang xây dựng một giao diện được xây dựng và kiểm soát 100% bằng JavaScript .. Và nút quay lại không có vị trí trong dự án của tôi vì không có thay đổi trang nào. (Tức là tốc độ nhanh và không có trang nào nhấp nháy do được làm mới .. Giống như một ứng dụng thực sự!)
Tôi biết tại sao khả năng "đánh cắp" giao diện không có ở đó và tôi hiểu điều đó. Nhưng ít nhất, chúng ta nên có khả năng yêu cầu nó từ trình duyệt! Bây giờ đó thực sự sẽ là "phương pháp tốt nhất" mà không có nguy cơ highjack.
Nhưng các trình duyệt là trình duyệt .. Tôi không mong đợi bất cứ điều gì thoát xảy ra về vấn đề này.
Tôi đang tìm kiếm câu hỏi tương tự và tôi tìm thấy mã sau trên một trang web. Tưởng chia sẻ ở đây:
function noBack()
{
window.history.forward()
}
noBack();
window.onload = noBack;
window.onpageshow = function(evt){ if(evt.persisted) noBack(); }
window.onunload = function(){ void(0); }
Tuy nhiên, theo lưu ý của người dùng ở trên, đây không bao giờ là một thực hành tốt và nên tránh vì mọi lý do.
Nếu bạn dựa vào công nghệ phía khách hàng, nó có thể bị phá vỡ. Ví dụ: Javascript có thể bị tắt. Hoặc người dùng có thể thực thi một tập lệnh JS để giải quyết các hạn chế của bạn.
Tôi đoán là bạn chỉ có thể làm điều này bằng cách theo dõi phía máy chủ của phiên người dùng và chuyển hướng (như trong Server.Transfer, không phải Response.Redirect) người dùng / trình duyệt đến trang được yêu cầu.
Đã có một vài cách triển khai khác nhau. Có một giải pháp flash và một số giải pháp khung / khung nội tuyến cho IE. Kiểm tra cái này
BTW: Có rất nhiều lý do hợp lệ để vô hiệu hóa (hoặc ít nhất là ngăn chặn 1 bước) nút quay lại - hãy xem gmail như một ví dụ thực hiện giải pháp băm được thảo luận trong bài viết trên.
Google "làm thế nào ajax đã phá vỡ nút quay lại" và bạn sẽ tìm thấy rất nhiều bài viết về thử nghiệm người dùng và tính hợp lệ của việc tắt nút quay lại.
Tôi cũng gặp vấn đề tương tự, sử dụng chức năng tập lệnh Java này trên thẻ head hoặc trong, nó hoạt động tốt 100%, sẽ không cho phép bạn quay lại.
<script type = "text/javascript" >
function preventBack(){window.history.forward();}
setTimeout("preventBack()", 0);
window.onunload=function(){null};
</script>
Hãy thử mã này. Đã làm cho tôi. Về cơ bản, nó thay đổi hàm băm ngay khi trang tải, điều này sẽ thay đổi trang lịch sử gần đây bằng cách thêm "1" trên URL. Vì vậy, khi bạn nhấn nút quay lại, nó sẽ chuyển hướng đến cùng một trang mọi lúc.
<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>
Bạn nên sử dụng các bài đăng có tiêu đề hết hạn và bộ nhớ đệm thích hợp.
Thay vì cố gắng vô hiệu hóa nút quay lại của trình duyệt, tốt hơn nên hỗ trợ nó. .NET 3.5 có thể xử lý rất tốt các nút quay lại (và chuyển tiếp) của trình duyệt. Tìm kiếm với Google: "Scriptmanager EnableHistory". Bạn có thể kiểm soát hành động nào của người dùng sẽ thêm mục nhập vào lịch sử của trình duyệt (ScriptManager -> AddHistoryPoint) và ứng dụng ASP.NET của bạn nhận được một sự kiện bất cứ khi nào người dùng nhấp vào nút Quay lại / Chuyển tiếp của trình duyệt. Điều này sẽ hoạt động cho tất cả các trình duyệt đã biết
Trên toàn cầu, vô hiệu hóa nút quay lại thực sự là một hoạt động tồi. Tuy nhiên, trong một số tình huống nhất định, chức năng của nút quay lại không có ý nghĩa.
Đây là một cách để ngăn điều hướng không mong muốn giữa các trang:
Trang trên cùng (tệp top.php):
<?php
session_start();
$_SESSION[pid]++;
echo "top page $_SESSION[pid]";
echo "<BR><a href='secondary.php?pid=$_SESSION[pid]'>secondary page</a>";
?>
Trang phụ (tệp 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>";
}
?>
Tác dụng là cho phép điều hướng từ trang trên cùng đến trang phụ và quay lại (ví dụ: Hủy) bằng cách sử dụng các liên kết của riêng bạn. Tuy nhiên, sau khi quay lại trang đầu, nút quay lại của trình duyệt bị ngăn không cho điều hướng đến trang phụ.
Ngay cả khi tôi đã đối mặt với tình huống tương tự trước đây ... và không có bất kỳ sự giúp đỡ nào. hãy thử những điều này có thể những điều này sẽ hiệu quả với bạn
trong <head>thẻ trang đăng nhập :
<script type="text/javascript">
window.history.forward();
</script>
trong Nút Đăng xuất Tôi đã làm điều này:
protected void Btn_Logout_Click(object sender, EventArgs e)
{
connObj.Close();
Session.Abandon();
Session.RemoveAll();
Session.Clear();
HttpContext.Current.Session.Abandon();
}
và trên trang đăng nhập, tôi đã tập trung vào hộp văn bản Tên người dùng như thế này:
protected void Page_Load(object sender, EventArgs e)
{
_txtUsername.Focus();
}
hy vọng điều này sẽ giúp ... :) ai đó làm ơn dạy tôi cách chỉnh sửa trang này ...
NẾU bạn cần tắt nhẹ các phím xóa và phím xóa lùi trong ứng dụng Web của mình, để khi chúng đang chỉnh sửa / xóa các mục, trang không bị chuyển hướng bất ngờ, bạn có thể sử dụng mã này:
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);
Hãy thử mã này. Bạn chỉ cần triển khai mã này trong trang chính và nó sẽ hoạt động cho bạn trên tất cả các trang
<script type="text/javascript">
window.onload = function () {
noBack();
}
function noBack() {
window.history.forward();
}
</script>
<body onpageshow="if (event.persisted) noBack();">
</body>
Vấn đề với Mã của Yossi Shasho là trang sẽ cuộn lên đầu sau mỗi 50 mili giây. Vì vậy, tôi đã sửa đổi mã đó. Bây giờ nó hoạt động tốt trên tất cả các trình duyệt hiện đại, IE8 trở lên
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(); });