Tắt nút quay lại của trình duyệt


98

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)?


92
Bạn không sở hữu máy tính của người dùng hoặc trình duyệt của họ.
Instance Hunter

47
+1 Bởi vì mặc dù tôi đồng ý rằng việc vô hiệu hóa nút quay lại của trình duyệt là 'hành vi xấu', tôi không thấy lý do gì để từ chối câu hỏi, trả lời và giải thích lý do tại sao lại là cách để sử dụng imo.
ChristopheD

45
Tại sao chúng ta lại thù địch với câu hỏi này? Đối với tất cả những gì chúng ta biết, người hỏi câu hỏi này đã biết rằng đây là cách thực hành kém khả năng sử dụng nhưng chỉ đang tuân theo các yêu cầu, hoặc có thể họ chỉ muốn học một thứ gì đó. Tại sao chúng ta không giả vờ đây là một câu hỏi giả định, và trả lời chúng ta sẽ làm như thế nào NẾU chúng ta phải làm điều đó?
thomasrutter

5
Một số điều không bao giờ nên được thực hiện, bất kể mong muốn làm chúng. Có một yêu cầu không thể thương lượng cho điều này ngay lập tức nói rằng các yêu cầu được đặt ra bởi những người không có kinh doanh đặt ra chúng, đó là một vấn đề lớn hơn nhiều.
annakata

37
ugh, tôi là tác giả của nhận xét tuyệt vời nhất từ ​​trước đến nay, nhưng đã đánh mất nó khi tôi vô tình nhấn nút quay lại.
Dan Williams

Câu trả lời:


26

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)

14
Lưu ý rằng việc làm cho trang không thể lưu vào bộ nhớ cache không đạt được những gì OP muốn: vô hiệu hóa việc truy cập các trang bằng nút quay lại. Ngay cả khi trình duyệt tuân theo no-cache khi sử dụng nút quay lại (mà trình duyệt không bắt buộc phải thực hiện AFAIK) thì họ vẫn cung cấp cách tải lại trang đó (thường là sau khi hiển thị hộp thoại cảnh báo). Vì vậy, nếu bạn thực sự không muốn người dùng của mình quay lại trang đó, điều này có thể tồi tệ hơn, vì yêu cầu cho trang đó sẽ PHẢI thực hiện theo cách của nó đến máy chủ gốc. Bạn sẽ cần một thứ gì đó phía máy chủ để phát hiện rằng trang đã được truy cập lại. Tiêu đề có thể được bỏ qua.
thomasrutter 11/11/09

60

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ọ.


6
Cảm ơn anh bạn, vấn đề là nếu bạn đang xây dựng một ứng dụng AJAX, sự cân bằng giữa lợi ích chi phí giữa việc tắt nút quay lại hoặc chuyển qua ứng dụng của bạn và tìm ra hành động quay lại thích hợp cho từng trường hợp có thể xảy ra, có thể hướng đến việc vô hiệu hóa nút quay lại là tùy chọn hấp dẫn hơn cả hai.
david.barkhuizen 27/12/12

Tôi đồng ý với Jonathan, đặc biệt là với hàng loạt quảng cáo phần mềm độc hại chuyển hướng hiện đang tràn ngập trên internet, họ đã lạm dụng hệ thống cảnh báo để khiến việc thoát trang của họ trở nên khó khăn mà không cho họ khả năng thực sự khóa bạn vào trang của họ
MikeT

46

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


1
Có vẻ như tập lệnh này thêm "#" vào URL khi trang tải và cứ sau 50 mili giây, tập lệnh này sẽ thêm 1 vào URL.
ashes999,

6
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

1
lưu ý rằng URL thay đổi hai lần: Chúng tôi chỉ làm điều này để che giấu việc triển khai, vì vậy sẽ không ai thấy rằng chúng tôi đã thêm "1". Vì vậy, thực tế khi người dùng nhấp lại, trang sẽ thêm lại "số 1" trong giây lát và xóa nó lần nữa. BTW - nó không nhất thiết phải là "1", nó có thể là bất kỳ chuỗi nào.
Yossi Shasho

2
Vấn đề với điều này là trang sẽ cuộn lên đầu sau mỗi 50 mili giây. Nếu bạn có một biểu mẫu lớn hơn chiều cao cửa sổ, điều này sẽ khiến bạn không thể điền các giá trị biểu mẫu vào quán trọ.
3komma14

Cảm ơn rất nhiều. Điều này cực kỳ hữu ích cho một trang tương tác đặc biệt dựa trên JavaScript mà tôi có, nơi cuộn sang trái và phải là một phần của cơ chế. Điều này giúp loại bỏ vấn đề cử chỉ cuộn trên Mac OS X đưa người dùng "quay lại" một trang một cách tình cờ (tất cả đều dễ thực hiện nếu họ đã được cuộn hết).
Iain Collins

34

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.


1
Ngân hàng của tôi thực hiện một cách tiếp cận khác - nó kết thúc phiên hoàn toàn. Sử dụng nút quay lại tương đương với việc đăng xuất.
RobG

Điều đó nghe giống như cách tiếp cận tương tự. Họ phát hiện ra rằng bạn đã quay lại và đưa ra một điều kiện lỗi.
thomasrutter

Joomla cũng làm việc xung quanh giải pháp mã thông báo, mã thông báo được tạo ra bởi mọi trang và mọi hình thức, có một số vấn đề về phương pháp này, chẳng hạn như "khi người dùng ở lại quá nhiều trên một trang và mã thông báo của anh ta hết hạn"
Matteo Bononi 'peorthyr'

1
Đừng hiểu sai ý tôi, có RẤT NHIỀU vấn đề với phương pháp này. Tôi không giới thiệu nó, tôi chỉ nói nó đạt được bình thường như thế nào. Chúng chuyển các mã thông báo duy nhất giữa các trang để phát hiện rằng bạn đã không theo một trong các liên kết mong đợi từ trang trước, sau đó kết thúc phiên hoặc hiển thị lỗi. Nó phá vỡ nút quay lại, phá vỡ trình duyệt theo thẻ, phá vỡ đánh dấu trang và / hoặc chia sẻ liên kết, v.v. - và hơn thế nữa, nó không thực sự giải quyết được bất kỳ vấn đề nào.
thomasrutter

nếu vấn đề là thông tin đã bị mất hoặc bị hỏng nếu người dùng cố gắng sử dụng nút quay lại, thì tắt nút quay lại sẽ là một cách tiếp cận mong muốn hơn.
PoloHoleSet

10

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.


1
100% không đồng ý, mặc dù chức năng này sẽ tuyệt vời đối với 99% nhà phát triển web, nhưng 1% còn lại sẽ lạm dụng chức năng này, theo ý kiến ​​của tôi là quá nguy hiểm khi cho phép một trang web kiểm soát khả năng sử dụng Internet của bạn tập lệnh chuyển hướng tên miền chéo cần cấm hoặc cho phép xác nhận xem tập lệnh có được phép chạy chỉ vì loại lạm dụng này không
MikeT

@MikeT - Việc tắt nút "quay lại" trong khi điều hướng trên các trang ứng dụng cụ thể của riêng tôi sẽ ngăn cản khả năng sử dụng Internet của bất kỳ ai?
PoloHoleSet

@PoloHoleSet nếu bạn có khả năng vô hiệu hóa nút quay lại của trình duyệt thì mọi người cũng vậy, tất cả những gì bạn cần là một chuyển hướng để đưa bạn đến một trang mà bạn không muốn đến và nếu họ có thể tắt các điều khiển điều hướng của bạn trong trình duyệt thì làm thế nào. bạn có trốn thoát không? Tôi chắc chắn rằng bạn đã đi qua các "bạn có một trang vi rút", nơi họ nhắc bạn cài đặt virus của họ để loại bỏ virus không tồn tại bây giờ tưởng tượng trang web đó, nơi họ thực sự có thể ngăn bạn rời khỏi
MikeT

@MikeT - Tôi có thể nhập bất kỳ url nào khác trong cửa sổ điều hướng, tôi có thể đóng tab, tôi có thể tắt javascript. Vấn đề không phải là liệu ai đó CÓ THỂ, bởi vì bạn có thể, tôi có thể, bất cứ ai cũng có thể. Về vấn đề chính sách, mọi người đang nói rằng bạn KHÔNG NÊN LÀM, nếu bạn có thể. Chúng tôi không nói về cách chúng tôi thiết kế một trình duyệt, chúng tôi đang nói về cách chúng tôi lập trình một ứng dụng.
PoloHoleSet,

@PoloHoleSet nếu bạn định khóa điều hướng, bạn cần phải khóa nhiều hơn là chỉ nút quay lại, vì lịch sử trình duyệt và các url đã nhập cũng sẽ cung cấp cho người dùng một cách để bỏ qua quy trình công việc của bạn. và giống như tôi đã nói, chúng tôi không nói về những gì bạn hoặc tôi sẽ làm ngoài yếu tố độc hại, nếu cách duy nhất để ngăn một trang web độc hại kiểm soát trình duyệt của bạn là tắt tất cả j trên trình duyệt của bạn thì bạn đã phá vỡ mạng internet như web hiện đại dựa trên kịch bản để cung cấp nội dung đó là quan điểm của tôi, nếu bạn muốn có nhiều quyền kiểm soát người dùng của bạn tạo ra một ứng dụng để phục vụ công việc của bạn
MikeT

4

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.


2
sẽ rất tốt nếu bạn có thể nêu lý do tại sao nên tránh nó.
Chris Snow

Theo sự hiểu biết của tôi, về mặt kỹ thuật, bạn không thể tắt nút Quay lại trên trình duyệt của ai đó, bạn chỉ có thể làm cho nút này không khả dụng hoặc tiếp tục tải cùng một trang. Thay vì làm điều đó thông qua JS, hãy sử dụng mã phía máy chủ và sử dụng logic thích hợp mà không cần sử dụng nút Quay lại. Nên sử dụng hành động thay thế như tải lại cùng một trang hoặc hiển thị thông báo tùy chỉnh.
user704988

2

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.



2

Đã 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

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

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.


Kiểm tra trình xem ảnh mới của Facebook. Lưu ý rằng nút quay lại đưa bạn trở lại ảnh (đó là những gì bạn muốn) thay vì làm theo mặc định của trình duyệt
DallinDyer

2

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>

1

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>


0

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


0

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ụ.


0

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


a) chỉnh sửa câu trả lời của bạn b) nhấp vào dấu chấm hỏi c) nhấp vào trợ giúp nâng cao d) đọc và áp dụng :-) Cũng lưu ý rằng ctrl-k un / thụt lề khối đã chọn để bỏ / định dạng dưới dạng mã. Cộng với định dạng không thể xử lý các tab tốt (có lẽ không phải là một vấn đề ở đây, mặc dù)
Kleopatra

0

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);

0

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>

0

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(); });

0

Điều này dường như đã làm việc cho chúng tôi.

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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.