How can I stop the browser back button using JavaScript?

前端 未结 30 3246
没有蜡笔的小新
没有蜡笔的小新 2020-11-22 00:07

I am doing an online quiz application in PHP. I want to restrict the user from going back in an exam.

I have tried the following script, but it stops my timer.

相关标签:
30条回答
  • 2020-11-22 01:02

    This seems to have worked for us in disabling the back button on the browser, as well as the backspace button taking you back.

    history.pushState(null, null, $(location).attr('href'));
        window.addEventListener('popstate', function () {
            history.pushState(null, null, $(location).attr('href'));
        });
    
    0 讨论(0)
  • 2020-11-22 01:04

    I believe the perfect yet solution is actually pretty straightforward, which I used for many years now.

    It's basically assigning the window's "onbeforeunload" event along with the ongoing document 'mouseenter' / 'mouseleave' events so the alert only triggers when clicks are outside the document scope (which then could be either the back or forward button of the browser)

    $(document).on('mouseenter', function(e) { 
            window.onbeforeunload = null; 
        }
    );
    
    $(document).on('mouseleave', function(e) { 
            window.onbeforeunload = function() { return "You work will be lost."; };
        }
    );
    
    0 讨论(0)
  • 2020-11-22 01:05

    It is generally a bad idea overriding the default behavior of the web browser. A client-side script does not have the sufficient privilege to do this for security reasons.

    There are a few similar questions asked as well,

    • How can I prevent the backspace key from navigating back?

    • How can I prevent the browser's default history back action for the backspace button with JavaScript?

    You can-not actually disable the browser back button. However, you can do magic using your logic to prevent the user from navigating back which will create an impression like it is disabled. Here is how - check out the following snippet.

    (function (global) {
    
        if(typeof (global) === "undefined") {
            throw new Error("window is undefined");
        }
    
        var _hash = "!";
        var noBackPlease = function () {
            global.location.href += "#";
    
            // Making sure we have the fruit available for juice (^__^)
            global.setTimeout(function () {
                global.location.href += "!";
            }, 50);
        };
    
        global.onhashchange = function () {
            if (global.location.hash !== _hash) {
                global.location.hash = _hash;
            }
        };
    
        global.onload = function () {
            noBackPlease();
    
            // Disables backspace on page except on input fields and textarea..
            document.body.onkeydown = function (e) {
                var elm = e.target.nodeName.toLowerCase();
                if (e.which === 8 && (elm !== 'input' && elm  !== 'textarea')) {
                    e.preventDefault();
                }
                // Stopping the event bubbling up the DOM tree...
                e.stopPropagation();
            };
        }
    })(window);
    

    This is in pure JavaScript, so it would work in most of the browsers. It would also disable the backspace key, but that key will work normally inside input fields and textarea.

    Recommended Setup:

    Place this snippet in a separate script and include it on a page where you want this behavior. In the current setup it will execute the onload event of the DOM which is the ideal entry point for this code.

    Working DEMO!

    It was tested and verified in the following browsers,

    • Chrome.
    • Firefox.
    • Internet Explorer (8-11) and Edge.
    • Safari.
    0 讨论(0)
  • 2020-11-22 01:05
    <html>
    <head>
        <title>Disable Back Button in Browser - Online Demo</title>
        <style type="text/css">
            body, input {
                font-family: Calibri, Arial;
            }
        </style>
        <script type="text/javascript">
            window.history.forward();
            function noBack() {
                window.history.forward();
            }
        </script>
    </head>
    <body onload="noBack();" onpageshow="if (event.persisted) noBack();" onunload="">
        <H2>Demo</H2>
        <p>This page contains the code to avoid Back button.</p>
        <p>Click here to Goto <a href="noback.html">NoBack Page</a></p>
    </body>
    </html>
    
    0 讨论(0)
  • 2020-11-22 01:06
    history.pushState(null, null, document.URL);
    window.addEventListener('popstate', function () {
        history.pushState(null, null, document.URL);
    });
    

    This javascript does not allow any user to go back (works in Chrome, FF, IE, Edge)

    0 讨论(0)
  • 2020-11-22 01:07

    Try this to prevent backspace button in IE which by default act as "Back":

    <script language="JavaScript">
    $(document).ready(function() {
    $(document).unbind('keydown').bind('keydown', function (event) {
        var doPrevent = false;
    
    
        if (event.keyCode === 8 ) {
            var d = event.srcElement || event.target;
            if ((d.tagName.toUpperCase() === 'INPUT' && 
                 (
                     d.type.toUpperCase() === 'TEXT' ||
                     d.type.toUpperCase() === 'PASSWORD' || 
                     d.type.toUpperCase() === 'FILE' || 
                     d.type.toUpperCase() === 'EMAIL' || 
                     d.type.toUpperCase() === 'SEARCH' || 
                     d.type.toUpperCase() === 'DATE' )
                 ) || 
                 d.tagName.toUpperCase() === 'TEXTAREA') {
                doPrevent = d.readOnly || d.disabled;
            }
            else {
    
                doPrevent = true;
            }
        }
    
        if (doPrevent) {
            event.preventDefault();
        }
    
        try {
            document.addEventListener('keydown', function (e) {
                   if ((e.keyCode === 13)){
                      // alert('Enter keydown');
                       e.stopPropagation();
                       e.preventDefault();
                   }
    
    
    
               }, true);
            } catch (err) {}
        });
    });
    </script>
    
    0 讨论(0)
提交回复
热议问题