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
1.9K00
代码可运行
举报
文章被收录于专栏:游戏杂谈游戏杂谈
运行总次数: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
2590
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事件的兼容操作
JavaScript基础学习--零碎
1、如果WINDOW对象是常规HTML页面,TOP就是SELF       var top = document.getElementById('top');      top.innerHTML  
用户1148399
2018/01/09
1K0
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事件)
java实现靠边隐藏窗口
说明: 由于个人精力有限,现将部分研究的代码开源出来, 代码或思路有部分来源于网络,有些代码还没来得及整理, 如果您对这其中的部分代码、思路整理出了一些文档,希望您能够联系我,分享您的成果 我将在下一版中更新您提供的一些文档. 开源不是靠一个人的坚持能完成的事,希望在不涉及版权问题的情况下,贡献您一份力量 版权归原作者所有,如果您有什么好的想法或建议,欢迎联系我 github: https://github.com/darknessitachi/swing-autoHiddenFrame AutoHiddenFrame.java
全栈程序员站长
2022/07/19
2.5K0
java实现靠边隐藏窗口
大佬日常必备的JS工具函数大全
前面我们分享过一篇:前端常用的60多种JavaScript工具方法,很多人觉得有用,今天再分享一篇类似的东西,如果文章和笔记能带您一丝帮助或者启发,请不要吝啬你的赞和收藏,你的肯定是我前进的最大动力
前端开发博客
2020/11/04
1.5K0
「JavaScript 」动画基础 - 02
请注意,本文编写于 2085 天前,最后修改于 173 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
3730
前端常见技术点-HTML扫盲(17问)
根据 <!DOCTYPE> 是否存在选择呈现模式,被称为 <!DOCTYPE> 切换或 <!DOCTYPE> 侦测。
用户5997198
2019/08/09
5990
html左侧浮动广告代码,jQuery 浮动广告实现代码[通俗易懂]
$(this).scroll(function() { // 页面发生scroll事件时触发
全栈程序员站长
2022/11/05
4.6K0
浅谈JavaScript的事件(事件模拟)
  事件经常由操作或者通过浏览器功能触发,通过JavaScript也可以触发元素的事件。通过JavaScript触发事件,也称为事件的模拟。 DOM中事件模拟   可以document的createEvent方法创建event对象。这个方法接收一个参数,即表示要创建的事件类型的字符串。在DOM2级中,所有这些字符串都使用英文复数形式,在DOM3级中都变成了单数。这几个字符串如下:UIEvents,一般化的ui事件,鼠标事件和键盘事件都继承于该事件,在DOM3级中是UIEvent;MouseEvents,一般
水击三千
2018/02/27
2K0
常见网页特效案例
节流阀目的:当上一个函数动画内容执行完毕,再去执行下一个函数动画,让事件无法连续触发。
清出于兰
2020/10/26
2.3K0
「JavaScript 」动画基础 - 01
请注意,本文编写于 2086 天前,最后修改于 174 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
5100
「JavaScript 」动画基础 - 01
前端-如何精确统计页面停留时长
页面停留时间(Time on Page)简称 Tp,是网站分析中很常见的一个指标,用于反映用户在某些页面上停留时间的长短,传统的Tp统计方法会存在一定的统计盲区,比如无法监控单页应用,没有考虑用户切换Tab、最小化窗口等操作场景。 基于上述背景,重新调研和实现了精确统计页面停留时长的方案,需要 兼容单页应用和多页应用,并且不耦合或入侵业务代码。
grain先森
2019/03/29
9.9K0
前端-如何精确统计页面停留时长
深入理解 DOM 事件机制
本文主要介绍 DOM 事件级别、DOM 事件模型、事件流、事件代理和 Event 对象常见的应用,希望对你们有些帮助和启发!
小生方勤
2019/06/02
2.8K1
前端day15-JS(WebApi)学习笔记(三大家族、事件对象、getComputedStyle)
offsetWidth、offsetHeight、offsetParent、offsetLeft、offsetTop
帅的一麻皮
2020/05/04
7030
前端day15-JS(WebApi)学习笔记(三大家族、事件对象、getComputedStyle)
DOM的事件模拟
只有根据DOM2级事件实现这些事件的浏览器才返回true,以非标准方式支持这些事件的浏览器会返回false;
meteoric
2018/11/15
1K0
JavaScript 鼠标拖拽div 改变其大小
转自: http://www.cnblogs.com/yushang/archive/2013/03/19/2968782.html
acoolgiser
2019/01/17
1.7K0
DOM、BOM一些兼容性问题
汇集了许多关于DOM和BOM的兼容性问题,主要是关于 IE 浏览器的,考虑到浏览器迭代,这里主要列出了 IE8 以及之后的浏览器版本。 IE8 浏览器在 2008年推出,距现在(2019)已有11年之久,已经是很老的一款浏览器了。但是在一些项目中,可能仍需要考虑到兼容性,如果兼容到 IE8 已经是很兼容了,毕竟该浏览器也几乎没多少市场份额了。多是一些机构或政府部门在使用。而有些兼容性问题也可能是其它浏览器之间的差异,比如 Chrome 和 FireFox 对于鼠标滚轮事件对象的滚轮方向判断方式不同,Chrome使用 wheelDelta,而FireFox 则采用 detail 做判断。下面将一一说明或做补充实现来尽量弥补浏览器之间的差异。其实大部分就是为了兼容 IE 早期浏览器。
多云转晴
2019/10/23
1.6K0
DOM、BOM一些兼容性问题
JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录
前言  最近实施的同事报障,说用户审批流程后直接关闭浏览器,操作十余次后系统就报用户会话数超过上限,咨询4A同事后得知登陆后需要显式调用登出API才能清理4A端,否则必然会超出会话上限。  即使在页面上增添一个登出按钮也无法保证用户不会直接关掉浏览器,更何况用户已经习惯这样做,增加功能好弄,改变习惯却难啊。这时想起N年用过的window.onbeforeunload和window.onunload事件。  本文记录重拾这两个家伙的经过,以便日后用时少坑。 为网页写个Dispose方法  C#中我们会将释
^_^肥仔John
2018/01/18
2.4K0
前端成神之路-WebAPIs05
offset 翻译过来就是偏移量, 我们使用 offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等。
海仔
2021/01/05
1.5K0
前端成神之路-WebAPIs05
相关推荐
JavaScript笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验