如何不让别人点击导航器的 return 按钮?

How not to let someone click on return button of navigator?

我在 W3 学校检查了这段代码:

window.addEventListener("beforeunload", function(event) {
  event.returnValue = "Write something clever here..";
});

您可以在您的 HTML 项目之一上使用,但要将其应用于导航器的 return 按钮? (为了警告用户,如果他继续,我将失去他的工作)

将事件侦听器添加到 return 按钮的方式与将其添加到 window 的方式相同。不要使用 beforeunload,而是使用 click。

您很可能需要创建自定义警报,这非常简单。我创建了一个 alertUser() 函数,该函数将在用户单击 return 按钮时触发。

您将要按照您的风格 sheet 使用 #customAlert {position: absolute, z-index: 10} 格式化 divElem。 position:absolute 确保它独立于其父元素中的其他元素。在这种情况下,它是页面的主体。 z-index 上的 10 过多,但要确保几乎每次都将警报放在最前面。除非有人用 z-index 10 或更大来格式化元素。您可以根据需要在页面上将其居中。

// Add this in your code after you have created the return button.  

var returnButton = document.getElementById("returnButtonId")
returnButton.addEventListener("click", () => alertUser(event), false);

function alertUser() {
    var divElem = document.createElement("DIV");
    var divText = document.createTextNode("If you go back you will lose progress");
    divElem.appendChild(divText);

    var btnReturn = document.createElement("BUTTON");
    var btnStay = document.createElement("BUTTON");
    var btnReturnText = document.createTextNode("Go Back");
    var btnStayText = document.createTextNode("Stay on page");
    btnReturn.appendChild(btnReturnText);
    btnStay.appendChild(btnStayText);

    divElem.appendChild(btnReturn);
    divElem.appendChild(btnStay);    
    divElem.setAttribute("id", "customAlert")
    btnReturn.setAttribute("id", "return");
    btnStay.setAttribute("id", "stay");
    var returnButton = document.getElementById("return");
    var stayButton = document.getElementById("stay")
    returnButton.addEventListener('click', () => leavePage(event), false);
    stayButton.addEventListener('click', () => stayOnPage(event), false);

}


function leavePage(e) {
    alert("Left page, progress lost")
    var customAlert = document.getElementById('customAlert')
    customAlert.remove()
    /**
     Your code to handle the user leaving the page     
     */
}

function stayOnPage(e) {
    alert("Stayed on page")
    var customAlert = document.getElementById('customAlert')
    customAlert.remove()
    /**
    Your code to handle the user staying on the page
    **/

}

根据评论更新

在代码中创建导航器及其按钮的某个时刻,应在该创建过程中为按钮分配一个唯一的 ID。在创建导航器按钮并为其分配 ID 后的某个时候,您将向导航器按钮添加一个事件侦听器,以包含 return 按钮。

var returnButton = document.getElementById('returnButtonIdfromNavigator') 
returnButton.addEventListener("click", () => alertUser(event), false);

这正是我所做的全部代码,更改了您搜索的 ID 名称,以符合您将其作为导航器按钮的要求。这两行没有创建按钮。它只是给你一个变量,它是对导航器中实际 return 按钮的引用,然后你通过该引用为按钮分配一个事件侦听器。

alertUser() 中创建的两个按钮不是导航的一部分,而是警报系统的一部分。它是 "Are you sure you want to do this?" 给用户的。 btnStay 将调用 stayOnPage(),并且正如其当前在此示例中所写的那样,将简单地解除警报,就好像什么都没发生一样,并允许用户继续他们所在的位置。虽然 btnReturn 将调用 leavePage(),如果我正在编写 leavePage() 函数,我将使用与 return 按钮在警报系统不存在时将使用的相同功能。

因此,在将事件侦听器分配给您的导航按钮时,您可以使用我假设已经存在的函数来实现 return 按钮行为,而不是使用 alertUser()。

//Adding event listeners to return button either with or without the warning

//Without alert system
var returnButton = document.getElementById('returnButtonIdfromNavigator') 
returnButton.addEventListener("click", () => navigatorReturnButtonFunction(event), false);

/****** VS ******/

//Using alert system
var returnButton = document.getElementById('returnButtonIdfromNavigator') 
returnButton.addEventListener("click", () => alertUser(event), false);

下面的代码用于禁用返回事件,但您可以将其用于您的目的。用户第一次单击后退按钮时,将显示警告消息。第二次单击后退将起作用。

history.pushState(null, null, location.href);
window.onpopstate = function () {
   alert("you will lose your job;(");
};

这个例子很简单。

var formHasUnsavedChanges = false;

window.addEventListener("beforeunload", function (e) {
    if (formHasUnsavedChanges === true) {
        var msg = "your warning message"; // Some browsers show their own message.
        (e || window.event).returnValue = msg; 
        return msg;
    }
});

一旦用户做出更改,就将 formHasUnsavedChanges 设置为 true

如果您通过 AJaX 调用保存表单,您可以在保存完成后将变量设置为 false

如果您使用普通表单,请在提交前将变量设置为 false。否则保存时会弹出警告信息

单击 link 或关闭选项卡时也会弹出此警告消息。

您不是在寻找这个答案吗? Browser back button "on click" action

这是一段 JS,用于检测用户何时使用浏览器后退按钮。

此代码运行良好:

<script>
    history.pushState(null, null, location.href);
    history.back();
    history.forward();
    window.onpopstate = function() {
        history.go(1);
    };
</script>