JavaScript禁止鼠标右键点击的浏览器后退事件(兼容IE9及以上)

提到禁止浏览器的后退行为,就不得不提到history这个api.而HTML5中中新引入的pushState()和 replaceState()方法。
现在你打开百度,搜索“js实现禁止浏览器后退功能”,你会看到一大片解决方案,当然也有所谓的“终极方案”,类似下面这种:

//防止页面后退
history.pushState(null, null, document.URL);
window.addEventListener('popstate', function () {
     history.pushState(null, null, document.URL);
 });                                      

经测试,这个方法在ie10以上确实完美的解决的禁止浏览器后退这一需求。但是如果我们想在ie9下也实现此需求那该如何做呢?要知道ie9是不支持pushState()这个函数的。此需求暂且不谈,咱们可以先谈谈上面这段代码是是怎么实现功能的。

history.pushState(stateObject,title,URL) 

上面这句代码的作用很简单,就是通过pushState()这个函数来操控浏览器历史。它有三个参数,分别是stateObject,title,URL。其中stateObject是一个对象,用来记录或存储和这条历史相关的状态信息。需要注意的是firefox浏览器对此对象的大小有限制,最多不能超过640kb,否则则会抛出异常。title一般写作null就好,因为firefox默认忽略此参数。url则是与当前url同源的地址,如果不指定,则默认为当前页面url,此方法并不会是页面跳转到指定的url中。。
这么看来上面的那段代码的作用就很清晰了。第1句在当此页面被加载时就给页面添加了一条历史记录,历史记录的url即是本页面的url。
然后第2句在通过popstate这个方法来监控浏览器的后退和前进行为,并在被触发时再次调用一次第一次的那句代码。这样就做到了当用户在不停的点击后退时,一直后退的其实是我们添加进去的历史记录,而且并不会改变你对当前页面的操作。
接下来我们谈谈如何在ie9下也实现此功能。在低版本的ie时代,在history这个API未增加新特性前,一般情况我们想要操控浏览器的历史是通过window.location.hash来完成的。

window.location.href = '/go/ahead'; //执行此代码时页面会跳转
window.location.hash = 'advance'; //执行此代码会给页面的url加上一条历史记录,历史记录的url为URL+'advance';

也就是说通过location.hash这个方法我们可以做到给页面插入历史记录而布使页面发生跳转。剩下的就是如何监控页面的后退事件了。
在低版本的ie下,想要监控浏览器的后退或前进行为是很困难的,你想直接去监听几乎没有原生的方法能做到。所以我们可以转换思路,利用hash来判断。

var hash_current = "ForbidBack";
var hash_last = "AgainForbidBack";
window.location.hash = hash_current;
window.location.hash = hash_last;
    

window.onhashchange = function () {
     window.location.hash = hash_current;
 };

此处的关键就是在开始就插入了一条hash,在浏览器的后退或前进时会触发url发生改变,所以可以通过window.onhashchange来监听。
如果你是一个带登陆的锁定页面,光是如上代码肯定不能满足你的需求,因为你还需要登陆,但是此时登陆产生的跳转事件也被禁止了,所以我们可以通过调用ajax来返回登陆成功后html,这样就避开了禁止行为。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章