JScript|Event]面向事件驱动的编程(二)--实例讲解:将span模拟成超连接
发布时间:2024-07-25 12:38:02
作者:泣红亭
在上一篇文章《面向事件驱动的编程》中我讲了三种将事件绑定到元素的方法,而推荐使用第三种方法,即使用attachEvent/addEventListener来绑定.上一篇文章的主旨是告诉大家如何使用事件,而这一篇文章的主旨是让大家弄懂如何灵活应用事件来批处理某一类的对象行为.
首先讲一讲事件传递的概念.什么是事件传递?举个现实的例子,有个人捏了一下你的手指,你可能会说他捏了你手指,也可能会说他捏了你的手,甚至可能会说他捏了你.事实上三种说法都没错,在浏览器事件的执行中亦有相似的情况,请看下边的例子:
<html id="HTMLElement" onclick="alert(this.id);"> <head> <title>测试页面</title> </head> <body> <table id="TABLEElement" onclick="alert(this.id);"> <tbody id="TBODYElement" onclick="alert(this.id);"> <tr id="TRElement" onclick="alert(this.id);"> <td id="TDElement" onclick="alert(this.id);"><input type="button" id="ButtonElement" onclick="alert(this.id);" value="按钮" /></td> </tr> </tbody> </table> <script type="text/javascript"> function Object_Onclick() { alert(this.id); } window.id = "windowObj"; window.onclick = Object_Onclick; window.document.id = "documentObject"; window.document.onclick = Object_Onclick; window.document.body.id = "bodyObject"; window.document.body.onclick = Object_Onclick; </script> </body> </html>
上边的例子给Input[type=button]、td、tr、tbody、table、body、html、document、window都设置了onclick事件处理函数,都是显示当前对象的id值,点击之后IE会依次出现ButtonElement、TDElement、TRElement、TBODYElement、bodyObject、HTMLElement、documentObj,而Firefox则有一点不同,它显示完documentObj之后还会显示windowObj,而IE却不会,这是因为IE的window对象没有onclick事件。从这里可以看出这些对象都受到了点击,执行了onclick事件函数,而且顺序是从事件来源对象一直往上传直到window对象,这就是浏览器的事件传递。
如何对一类元素的事件进行处理,这是本文的重点,而重点知识又在于事件的传递。从上边的例子可以看出,不管是哪里的对象引发了一个事件,最后都会往上传递,我们要做的是在事件的必经之路上处理它,建议使用window.document。再看一个例子:
<html> <head> <title>测试页面</title> </head> <body> 无忧脚本论坛1 无忧脚本论坛2 <script type="text/javascript"> function Links_Onclick(e) { var src = window.document.all != null ? e.srcElement : e.target; //获取事件来源对象 alert(src.innerHTML); } if(window.document.all != null) window.document.attachEvent("onclick", Links_Onclick) else window.document.addEventListener("click", Links_Onclick, false); </script> </body> </html>
上边的例子给window.document绑定了一个点击事件处理函数Links_Onclick,在里边我获取了事件来源对象,并且显示它的innerHTML值,可以看出不管在IE还是在Firefox,点击无忧脚本论坛1的时候会显示"无忧脚本论坛1",点击无忧脚本论坛2的时候会无忧脚本论坛2,这下明白为什么我要大费周章讲事件传递了吧?我们正是要利用这一点,实现文章标题所说的:将span元素模拟成连接元素。
分析一下连接元素的一般特点:
1、有下划线
2、鼠标移动上去会变成手型鼠标
3、点击之后会进入某一个页面(href属性)
4、可以设置目标窗口的名称(target属性)
接下来一步一步实现上边所举的特点,首先是下划线和鼠标移动上去会变成手型鼠标,这个很简单,用CSS即可,可以与脚本无关,请看示例:
<html> <head> <title>测试页面</title> <style type="text/css"> span.link { text-decoration:underline; color:blue; cursor: pointer; } </style> </head> <body> 无忧脚本1 无忧脚本2 </body> </html>
接下来是实现“点击之后会进入某一个页面”,可以给span元素增加一个属性href保存url,同时处理它的onclick事件,这就要用到刚才我说了半天的事件传递,思路是给window.document对象绑定一个onclick处理函数,如果事件来源对象的标签名(tagName)是span,它的class属性值为link,并且它拥有一个非空href属性,就调用window.open打开href属性所保存的url。
<html> <head> <title>测试页面</title> <style type="text/css"> span.link { text-decoration:underline; color:blue; cursor: pointer; } </style> <script type="text/javascript"> function Document_Onclick(e) { var src = window.document.all != null ? e.srcElement : e.target; if(src.tagName != null && src.className != null && src.getAttribute("href") != null && src.tagName.toString().toLowerCase() == "span" && src.className.toString().toLowerCase() == "link" && src.getAttribute("href").toString().length > 0) { window.open(src.getAttribute("href").toString()); } } if(window.document.all != null) window.document.attachEvent("onclick", Document_Onclick); else window.document.addEventListener("click", Document_Onclick, false); </script> </head> <body> 无忧脚本1 无忧脚本2 </body> </html>
点击上边示例代码所模拟出来的“连接”之后,浏览器会连接到无忧脚本论坛(http://www.51js.com),第三个特点也实现了。在这里特别说明一下:Firefox不支持直接使用src.href获取我们自定义的href属性,因此使用了IE和Firefox都支持的getAttribute(attributeName)方法,如果不存在则返回null。
最后的工作是增加target属性实现设置目标窗口的功能,要注意一点就是target属性是可有可无的,实现方法很简单,利用上边的实例就可以轻松实现,就是在window.open那里做一点点手脚,请看示例代码:
<html> <head> <title>测试页面</title> <style type="text/css"> span.link { text-decoration:underline; color:blue; cursor: pointer; } </style> <script type="text/javascript"> function Document_Onclick(e) { var src = window.document.all != null ? e.srcElement : e.target; if(src.tagName != null && src.className != null && src.getAttribute("href") != null && src.tagName.toString().toLowerCase() == "span" && src.className.toString().toLowerCase() == "link" && src.getAttribute("href").toString().length > 0) { if(src.getAttribute("target") != null && src.getAttribute("target").toString().length > 0) window.open(src.getAttribute("href").toString(), src.getAttribute("target").toString()); else window.open(src.getAttribute("href").toString()); } } if(window.document.all != null) window.document.attachEvent("onclick", Document_Onclick); else window.document.addEventListener("click", Document_Onclick, false); </script> </head> <body> 无忧脚本1 无忧脚本2 </body> </html>
搞定!我们已经初步将拥有特定属性的span元素模拟成了超连接元素,当然这里边还大有文章可做,但这并不是重点,而且将span元素模拟成超连接并没有什么实用价值,毕竟已经有那么好用的A元素可以供我们使用,所以要弄明白一点:搞清楚事件的传递,并且利用它为我们做一些本来很麻烦的工作,这才是本文的重点。
好了,又要告一段落了,下一篇文章的主题还没定,估计是再来一个实例或者另开一个主题,敬请期待。
欢迎有兴趣的同志支持一下无忧脚本论坛的原创行动,一起将您的原创文章贴出来与网友分享,还记得一篇文章里说过这样的话:那些曾经帮助我们的人们,他们没有想过要得到回报,如果硬要说有,那也是希望你能够像他们那样帮助需要帮助的人。


猜你喜欢
- 实例如下:# bytes object b = b"example" # str object s = "ex
- 参考自官方文档参数注册尝试自己写GoogLeNet时碰到的问题,放在字典中的参数无法自动注册,所谓的注册,就是当参数注册到这个网络上时,它会
- 前言:大家跟我一起念,Python * 好,跟着本宝宝用Python抢火车票首先我们需要splinter安装:pip install spli
- 前言:Selenium 支持 Web 浏览器的自动化,它提供一套测试函数,用于支持 Web 自动化测试。函数非常灵活,能够完成界面元素定位、
- 实例如下:#! /usr/bin/python# -*- coding: utf-8 -*-import osdef del_dir_tre
- 1.如何用函数先定义后调用,定义阶段只检测语法,不执行代码调用阶段,开始执行代码函数都有返回值定义时无参,调用时也是无参定义时有参,调用时也
- 概述pandas中与库版本或依赖库版本相关的API主要有以下4个:pandas.__version__:查看pandas简要版本信息。pan
- // 获取地址栏的参数数组function getUrlParams() { var search =
- 本文实例为大家分享了python样条插值的具体实现代码,供大家参考,具体内容如下import numpy as npimport panda
- share一些python实现的code#!/usr/bin/env python#coding=utf-8import cv2img =
- 默认情况下,TensorFlow 会映射进程可见的所有 GPU 的几乎所有 GPU 内存(取决于 CUDA_VISIBLE_DEVICES)
- 删除重复记录,将TABLE_NAME中的不重复记录保存到#TABLE_NAME中 select distinct *&n
- 1. 前言CASE 表达式是从 SQL-92 标准开始被引入的。在 CASE 表达式里,可以使用 BETWEEN 、LIKE和 < 、
- 本文实例为大家分享了ADO.NET通用数据库访问类,供大家参考学习,具体内容如下using System;using System.Coll
- Celery简介Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度
- 个人理解:动态路由不同于常见的静态路由,可以根据不同的「因素」而改变站点路由列表。常见的动态路由大都是用来实现:多用户权限系统不同用户展示不
- 文章开始先讲下交叉验证,这个概念同样适用于这个划分函数1.交叉验证(Cross-validation)交叉验证是指在给定的建模样本中,拿出其
- sql xml 入门: --by jinjazz 1、xml: 能认识元素、属性和值 2、xpath: 寻址语言,类似windows目录的查
- 关于python 使用xpath获取网页信息的方法?1、xpath的使用方法?XPath 使用路径表达式来选取 XML 文档中的节点或节点集
- #! /usr/bin/env python#coding=utf-8#实现哈希表(线性地址再散列)def ChangeKey(key,m,