给页面 unload 加上效果
作者:xlingfairy 来源:dajiaozi.com 发布时间:2009-03-12 12:32:00
此站:http://www.cbmland.com/ 的页面离开时的效果非常NB!佩服的很。
一开始,我以为是用事件 onunload,试了一把,跟本就没效果。因为,效果还不曾触发,页面以转走了。
后来分析了一下他的JS,发现是用 onclick 来完成的。
下面,我就来说说。
为什么不用 onunload ,我前面就说过了。而且,本司令以前做 跟踪 浏览者停留 在 某个页面 多长时间 的时候,就给上司提出过,用 onunload 完全不可行。
那么这个站的原理是什么呢?
用 onclick, document.documentElement.onclick
因为 点击一个链接,首先会触发一个 onclick 事件,这个事件会冒泡到document.documentElement, 在 documentElement 的 onclick 处理完后,那个 链接 才会接着处理。
很简单。为了达到这个目的,首先要过滤事件源,如果不是 <a>,就放弃,其次在判断这个 <a> 是不是一个锚点链接,是不是一个 javascript等。
看下面代码:
var collapseRightColumn = function(evt){
evt = window.event || evt;
var obj = evt.srcElement || evt.target;
while(obj && obj.tagName != 'A'){
obj = obj.parentNode;
}
if(obj == null || obj.tagName != 'A') return;
if(
(obj.getAttribute('name') != '' && obj.getAttribute('name') != null) ||
obj.getAttribute('href') == '' ||
obj.getAttribute('href') == null ||
/#/.test(obj.href) ||
/^javascript/.test(obj.href) ||
obj.onclick != undefined ||
(obj.target != '' && obj.target != '_self' && obj.target != '_top' && obj.target != '_parent')
)
return true;
else{
var a = function(){
var rightColumn = JObj.$('rightColumn');
var ani = JObj.UI.JAnimate.$(rightColumn);
ani.runFromCurrent({left:document.documentElement.clientWidth,alpha:10});
}
//如果 availWidth 大于 1024 只收缩 rightColumn
if(screen.availWidth > 1024)
a();
else{//否则,先隐藏 open 按 钮
var ani = JObj.UI.JAnimate.$('open1024');
ani.onComplete = a;
ani.runFromCurrent({top:-60});
}
}
}
JObj.addEvent(document.documentElement,'onclick',collapseRightColumn);
首先过滤事件源:
while(obj && obj.tagName != 'A'){
obj = obj.parentNode;
}
if(obj == null || obj.tagName != 'A') return;
因为 a 里可以包括 <span><img>等标签。
二,放弃 是 锚点的,没有href属性的,href='javascript:xxx'的,target 是新页的。
if(
(obj.getAttribute('name') != '' && obj.getAttribute('name') != null) ||
obj.getAttribute('href') == '' ||
obj.getAttribute('href') == null ||
/#/.test(obj.href) ||
/^javascript/.test(obj.href) ||
obj.onclick != undefined ||
(obj.target != '' && obj.target != '_self' && obj.target != '_top' && obj.target != '_parent')
)
因为 IE和FF的 getAttribute 取一个不存在的属性时,返回的值不同,所以用了: (obj.getAttribute('name') != '' && obj.getAttribute('name') != null) 这样的写法。
3,运行效果。具体怎么实现,就看个人造化了。
另外,如果在这个 onclick 事件,如果return false ,在IE下,你点了链接,页面也是不会跳转的。其它浏览器没影响。http://my.dajiaozi.com 上,我以加了效果,分辨率 > 1024 和 <= 1024 我做了不同的处理,两种分辨率下的效果不同。


猜你喜欢
- 用途:图片经常使用onload来改变宽度,但这样会出现图片的闪烁,这个简单的类就是用来解决这个问题的。函数loadImage,用来加载图片,
- 一、query传参编程式导航 使用router.push 或者 router.replace 的时候,改为对象形式新增query 必须传入一
- 读写文件首先看一个例子:f = open('thefile.txt','w') #以写方式打开,
- python列表变量可以存储一个元素,而列表是一个大容器,可以存储N多个元素,程序可以方便的对这些数据进行整体操作(可以存储多个不同的数据类
- 更新什么?概况一览1、优化了 Promise.all 的定义,在 3.7 版本中一些混用 null 或 undefined 的时候的问题已经
- 1.zip用法简介在python 3.x系列中,zip方法返回的为一个zip object可迭代对象。class zip(object):&
- 1,新建一个项目File --> New Project...2,新建一个文件右键单击刚建好的helloWord项目,选择New --
- 背景:线上机器,需要过滤access日志,发送给另外一个api期初是单进程,效率太低,改为多进程发送后,查看日志中偶尔会出现异常错误(忘记截
- 爬取xxx天气爬取网址:https://tianqi.2345.com/today-60038.htm安装pip install scrap
- keepAlive的使用在开发的过程中如果碰到经常浏览需要缓存的页面,而且页面很长需要记录滚动的位置这时就需要用到keepAlive。一共有
- 数组中重复的数字在上一篇博客中剑指Offer之面试题3: 数组中重复的数字中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素。
- 关于投票系统怎么样怎么样的引言就不多说,这不是毕业设计,主要说一下使用php实现投票系统,与其他普通系统一样,分为两部分,一个是管理员部分,
- 引言 近期公司vue前端项目需求:实现弹窗的拖拽,四边拉伸及对角线拉伸,以及弹窗边界处理
- 使用现有的txt文本和图片,就可以用wordcloud包生成词云图。大致步骤是:1、读取txt文本并简单处理;2、读取图片,以用作背景;3、
- 从windows操作系统本地读取csv文件报错data = pd.read_csv(path)Traceback (most recent
- 前言虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Req
- 打开一个Project在导航区带出多个Project将会影响PyCharm的运行速度,解决这个问题的方式只打开一个即可。有时候打开一个Pro
- 这篇文章主要介绍了如何使用python3获取当前路径及os.path.dirname的使用,文中通过示例代码介绍的非常详细,对大家的学习或者
- 想要利用Python来操作word文档可以使用docx模块.安装: pip install python-docxfrom docx imp
- 数据的安全性策略: 数据的生考虑应基于数据的重要性。如果数据不是很重要,那么数据的安全性策略可以稍稍放松一些。然而,如果数据很重要,那么应该