如何使用标准化JavaScript(不是`onbeforeunload`)停止页面卸载

时间:2011-11-06 22:19:11

标签: javascript html5 events onunload

在你重新链接我之前,我已经阅读了How do I stop a page from unloading (navigating away) in JS?之类的问题,但是他们处理的是HTML4及以下版本。我想要一个利用HTML5事件属性onunload的答案。我也希望它尽可能地纯净,即没有外部库或插件,如jQuery或Flash,只使用标准化代码( PURE HTML,CSS和JavaScript,不依赖于平台)。< / em>的

在您告诉我使用onbeforeunload之前,请注意它是 NON-STANDARD ,因此不符合我上述的标准。它不适用于所有浏览器,特别是那些在IE实现之前制作的浏览器。

问题


在我的网站上,我有几个音乐播放器,当用户试图离开页面时,如果其中任何一个正在播放,我想弹出一个对话框,确保他们打算这样做并且他们明白这一点将停止音频流,如果他们选择“是”或“确定”,它继续导航,但如果他们点击“否”或“取消”,它将保持在同一页面上并继续播放音频而不会中断。 如何在不使用ONBEFOREUNLOAD的情况下使用JavaScript取消页面卸载?

到目前为止的代码


到目前为止,我有以下代码,但不知道如何停止卸载:

<!DOCTYPE HTML><html>
<head>
    <script><!-- Loading Scripts -->
    function unloadTasks(){
        window.alert(":" + playing + ":");
        if (playing && !window.confirm("A podcast is playing, and navigating away from this page will stop that. Are you sure you want to go?"))
            window.alert("Here is where I will stop the page from unloading... somehow");
    }
    </script>
    <script><!-- Player Scripts -->
    var playing = false;
    function logPlay(){
        playing = isPlaying("e1audPlayer");
    }
    function isPlaying(player){
        return document.getElementById(player).currentTime > 0 && !document.getElementById(player).paused && !document.getElementById(player).ended;
    }
    </script>
</head>
<body onunload="unloadTasks()">
<audio id="e1audPlayer" style="width:100%;" controls="controls" preload="auto" onplaying="logPlay()" onpause="logPlay()">
    <source src="http://s.supuhstar.operaunite.com/s/content/pod/ADHD Episode 001.mp3" type="audio/mpeg"/>
    <source src="http://s.supuhstar.operaunite.com/s/content/pod/ADHD Episode 001.ogg" type="audio/ogg"/>
    Your browser does not support embedded audio players. Try <a href="http://opera.com/">Opera</a> or <a href="http://chrome.com/">Chrome</a>
</audio>
<a href="http://example.com/">Link away</a>
</body>
</html>

Working example

2 个答案:

答案 0 :(得分:1)

您应该使用onbeforeunload来提示用户输入消息。

答案 1 :(得分:0)

你无法完全阻止这种情况,但是可以通过弹出窗口通知用户他不应该重新加载。这是通过onbeforeunload窗口事件完成的,最好记录在MDN

如果您在回答textarea中添加一些文本而不是尝试离开页面,这将与Stackoverflow中的行为完全相同。