Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >onbeforeunload事件被a链接触发的问题

onbeforeunload事件被a链接触发的问题

作者头像
meteoric
发布于 2018-11-16 07:49:57
发布于 2018-11-16 07:49:57
2K00
代码可运行
举报
文章被收录于专栏:游戏杂谈游戏杂谈
运行总次数:0
代码可运行

onbeforeunload本身并非W3C DOM-Event标准事件,只不过在很多时候国内的流氓做法就是离开页面,直接弹出收藏本网页的提示(虽然我很讨厌这种做法,但事实上很多公司一直都在这样默默地强奸用户…)

言归正传,我遇到的问题是,自己的游戏上了新浪微游戏,在新浪微游戏的顶部有它们的导航,但是点击里面一些按钮时就会触发游戏里面的window.onbeforeunload事件…

搜索了一下,找到这篇文章:BX2047: 各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异

根据 MSDN 中描述,IE 的 onbeforeunload 事件可由以下这些条件触发:

  • 关闭当前浏览器窗口。
  • 导航到另一个进入一个新的地址或选择一个喜欢的位置。
  • 单击后退,前进,刷新,或主页按钮。
  • 点击一个链接到新页面。
  • 调用 超链接的 click 方法。
  • 调用 document.write 方法。
  • 调用 document.open 方法。
  • 调用 document.close 方法。
  • 调用 window.close 方法。
  • 调用 window.open 方法,窗口名称设置值为 _self。
  • 调用 window.navigate 或 NavigateAndFind 方法。
  • 调用 location.replace 方法。
  • 调用 location.reload 方法。
  • 指定一个 location.href 属性的新值。
  • 使用 submit 按键提交表单,或调用 form.submit 方法。

更详细的说明可以查考 MSDN 原文:onbeforeunload Event

我写了一个测试例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1: <div class='links'>

       2:     <a href='#'>test1</a>

       3:     <a href='javascript:;'>test2</a>

       4:     <a href='javascript:;' onclick='alert("test3")'>test3</a>

       5:     <a href='#' onclick='alert("test4")'>test4</a>

       6: </div>

       7:  

       8: <iframe src="http://b.com/xx/xxx.html" frameborder="no" scrolling="no" id="app_frame" name="app_frame" style="height: 600px; width: 100%;"></iframe>

如果iframe中有window.onbeforeunload事件,在点击链接test2、test3时会触发iframe内的window.onbeforeunload事件,test1、test4则不会,尽管页面与iframe并非同一域。

我知道会有很多办法避免这种情况发生,比如改父层的实现==,但是这个页面是新浪微游戏的,我根本不可能有权力去要求什么…

所以想到一个办法是,在window.onbeforeunload函数里,判断当前鼠标的位置,如果在某一范围内则认为是点击了新浪微游戏的那些东东,不显示提示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1: /**

       2:  * 获取鼠标在页面上的位置

       3:  * @param ev  触发的事件

       4:  * @return  x:鼠标在页面上的横向位置, y:鼠标在页面上的纵向位置

       5:  */

       6:  

       7: function getMousePoint(ev) {

       8:   var point = {

       9:     x: 0,

      10:     y: 0

      11:   };

      12:   if (typeof window.pageYOffset != 'undefined') {

      13:     point.x = window.pageXOffset;

      14:     point.y = window.pageYOffset;

      15:   } else if (typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') {

      16:     point.x = document.documentElement.scrollLeft;

      17:     point.y = document.documentElement.scrollTop;

      18:   } else if (typeof document.body != 'undefined') {

      19:     point.x = document.body.scrollLeft;

      20:     point.y = document.body.scrollTop;

      21:   }

      22:   point.x += ev.clientX;

      23:   point.y += ev.clientY;

      24:   return point;

      25: }

      26:  

      27: function bindWindowEvent() {

      28:     window.onbeforeunload = function (evt) {

      29:         evt = evt || window.event;

      30:         

      31:         var obj = getMousePoint(evt);

      32:         if (obj.y < 76 && obj.y > 0) {

      33:             return ;

      34:         }

      35:  

      36:         var msg = '嘻嘻嘻';

      37:         

      38:         return msg;

      39:     };

      40: }

      41:  

      42: bindWindowEvent();

希望各位达人能提供更好的解决方法…

本文参考:

1、BX2047: 各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异

2、onbeforeunload与a标签在IE中的冲突bug

3、Can I prevent window.onbeforeunload from being called when doing an AJAX call

4、onbeforeunload event

5、Get Cursor Position with JavaScript

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-08-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript笔记
因为IE浏览器下不支持年月日日之间有横线连接的形式,所以在IE浏览器下做日期格式化时,需要用下面的正则表达式先将 横线转换成斜线,例如将2019-12-31 10:48:30 转成 2019/12/31 10:48:30
用户3880999
2023/04/13
2670
JavaScript笔记
ASP.NET AJAX(12)__浏览器兼容功能判断浏览器的类型和版本Sys.Browser针对DOM元素的兼容操作针对DOM事件的兼容操作
目前,常见的浏览器IE(6,8,9),chrome,firefox,safari等,还有国内的一些曾经靠恐吓用户来提高使用率的某浏览器(河蟹社会),这些浏览器对于Javascript的语言特性实现大致是相同的,但是对于DOM操作方式却大相径庭,所以我们通常需要自己对不同浏览器对于DOM的操作方式进行分而治之,或者我们往往是使用一些Javascript框架提供的兼容功能,当然也有我们的Microsoft AJAX Library 判断浏览器的类型和版本 浏览器兼容层的优势在于,我们可以使用同样的编码方式,让相
小白哥哥
2018/03/07
1.2K0
ASP.NET AJAX(12)__浏览器兼容功能判断浏览器的类型和版本Sys.Browser针对DOM元素的兼容操作针对DOM事件的兼容操作
onbeforeunload事件_pageload事件何时触发
注意:为了防止不需要的弹出窗口,浏览器可能不会显示在beforeunload事件处理程序中创建的提示,除非页面已与之交互,甚至根本不显示它们。
全栈程序员站长
2022/11/03
3.1K0
JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录
前言  最近实施的同事报障,说用户审批流程后直接关闭浏览器,操作十余次后系统就报用户会话数超过上限,咨询4A同事后得知登陆后需要显式调用登出API才能清理4A端,否则必然会超出会话上限。  即使在页面上增添一个登出按钮也无法保证用户不会直接关掉浏览器,更何况用户已经习惯这样做,增加功能好弄,改变习惯却难啊。这时想起N年用过的window.onbeforeunload和window.onunload事件。  本文记录重拾这两个家伙的经过,以便日后用时少坑。 为网页写个Dispose方法  C#中我们会将释
^_^肥仔John
2018/01/18
2.4K0
html左侧浮动广告代码,jQuery 浮动广告实现代码[通俗易懂]
$(this).scroll(function() { // 页面发生scroll事件时触发
全栈程序员站长
2022/11/05
4.8K0
用框架的你,可能早已忽略了这些事件API
DOMContentLoaded,load,beforeunload,unload
若川
2021/01/28
1.8K0
JavaScript基础学习--零碎
1、如果WINDOW对象是常规HTML页面,TOP就是SELF       var top = document.getElementById('top');      top.innerHTML  
用户1148399
2018/01/09
1.1K0
浅谈JavaScript的事件(事件模拟)
  事件经常由操作或者通过浏览器功能触发,通过JavaScript也可以触发元素的事件。通过JavaScript触发事件,也称为事件的模拟。 DOM中事件模拟   可以document的createEvent方法创建event对象。这个方法接收一个参数,即表示要创建的事件类型的字符串。在DOM2级中,所有这些字符串都使用英文复数形式,在DOM3级中都变成了单数。这几个字符串如下:UIEvents,一般化的ui事件,鼠标事件和键盘事件都继承于该事件,在DOM3级中是UIEvent;MouseEvents,一般
水击三千
2018/02/27
2.1K0
什么是 JavaScript 事件?
JavaScript事件是指在网页中发生的交互性操作或特定的系统事件,例如用户的点击、鼠标移动、按键按下等。通过JavaScript,你可以捕捉和处理这些事件,并在事件发生时执行相应的代码。
王小婷
2023/11/05
3910
DOM事件第二弹(UIEvent事件)
此文章主要总结UIEvent相关的事件,如有不对的地方,欢迎指正。 一、uitls.js(绑定事件公共类) var fixs = { 'focusin': { standard: 'focus', ie: 'focusin' }, 'focusout':{ standard: 'blur', ie: 'foucsout' }, 'input': { standard: 'input',
sam dragon
2018/01/17
2.9K0
DOM事件第二弹(UIEvent事件)
JavaScript 鼠标拖拽div 改变其大小
转自: http://www.cnblogs.com/yushang/archive/2013/03/19/2968782.html
acoolgiser
2019/01/17
1.8K0
「JavaScript 」动画基础 - 01
请注意,本文编写于 2086 天前,最后修改于 174 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
5270
「JavaScript 」动画基础 - 01
前端成神之路-WebAPIs05
offset 翻译过来就是偏移量, 我们使用 offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等。
海仔
2021/01/05
1.5K0
前端成神之路-WebAPIs05
前端day15-JS(WebApi)学习笔记(三大家族、事件对象、getComputedStyle)
offsetWidth、offsetHeight、offsetParent、offsetLeft、offsetTop
帅的一麻皮
2020/05/04
7050
前端day15-JS(WebApi)学习笔记(三大家族、事件对象、getComputedStyle)
【HTML5】Canvas 内部元素添加事件处理
canvas 没有提供为其内部元素添加事件监听的方法,因此如果要使 canvas 内的元素能够响应事件,需要自己动手实现。实现方法也很简单,首先获得鼠标在 canvas 上的坐标,计算当前坐标在哪些元素内部,然后对元素进行相应的操作。配合自定义事件,我们就可以实现为 canvas 内的元素添加事件监听的效果。
零式的天空
2022/03/02
2.2K0
前端学习(51)~事件的传播和事件冒泡
重点:捕获阶段,事件依次传递的顺序是:window --> document --> html--> body --> 父元素、子元素、目标元素。
Vincent-yuan
2020/03/19
1K0
前端-如何精确统计页面停留时长
页面停留时间(Time on Page)简称 Tp,是网站分析中很常见的一个指标,用于反映用户在某些页面上停留时间的长短,传统的Tp统计方法会存在一定的统计盲区,比如无法监控单页应用,没有考虑用户切换Tab、最小化窗口等操作场景。 基于上述背景,重新调研和实现了精确统计页面停留时长的方案,需要 兼容单页应用和多页应用,并且不耦合或入侵业务代码。
grain先森
2019/03/29
10K0
前端-如何精确统计页面停留时长
深入理解 DOM 事件机制
本文主要介绍 DOM 事件级别、DOM 事件模型、事件流、事件代理和 Event 对象常见的应用,希望对你们有些帮助和启发!
小生方勤
2019/06/02
2.9K1
前端学习(50)~事件的绑定和事件对象
我们在之前的一篇文章《04-JavaScript/22-DOM简介和DOM操作》中已经讲过事件的概念。这里讲一下绑定(注册)事件的两种方式,我们以onclick事件为例。
Vincent-yuan
2020/03/19
9660
事件
JavaScript与HTML之间的交互式通过事件实现的。 事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码。
奋飛
2019/08/15
3.3K0
相关推荐
JavaScript笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验