完美解决一个事件激活多个函数(2)

2016-01-29 11:33 6 1 收藏

完美解决一个事件激活多个函数(2),完美解决一个事件激活多个函数(2)

【 tulaoshi.com - Javascript 】

 


  可是在一个页面中,我们可能会遇到有多个事件要激活多个函数,每个事件都要写一遍那样的代码,显然不是好主意。聪明的读者可能已经想到,应该写成一个函数activeMore(),哪个事件要激活多个函数的,直接就用activeMore()就行。

  但是在上一部分中我们把事件的toString()当作JavaScript脚步本运行,实际上是运行一段函数代码,如果写成一个函数时还是用这个方法,即为函数中嵌套函数,将会出现意想不到的错误。 于是我们写成函数时把事件的toString()中的“function anonymous()”字符去掉,运行时就不是一个函数,而是函数内部的代码了。另外我们还可以定义先激活原有的函数还是先激活现在要激活的函数。最后为了方便使用,我们把事件和要激活的函数放在一起作为参数,写成以下函数:


function activeMore(event_function,order){
// order 为负数时先激活myFunction再激活前面的脚本
var isSn=event_function.indexOf("=",0);
var myEvent=event_function.substring(0,isSn);
var myFunction=event_function.substring(isSn+1,event_function.length);
var prefunction="";
if(eval(myEvent)) prefunction= eval(myEvent).toString().replace('function anonymous()',"");

if(order<0) eval(myEvent+"=new Function(myFunction+'n'+prefunction)");
else eval(myEvent+"=new Function(prefunction+'n'+myFunction)");
}

  以上函数我们先把参数“event_function”进行字符串分析,得到事件(myEvent)和要激活的函数(myFunction),然后取得原来激活的函数(preFunction),最后把多个函数放在一起激活。因为我们只是把“function anonymous()”去掉,preFunction字符串的两端会带有“{ }”号,但并不影响程序的运行。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/javascript/)

  下面我们举一个实际应用的例子:使网页中所有的链接都不出现虚线框。

  为了达到这个目的,我们给所有的链接的onfocus事件添加一个激活函数“blur()”。为了保证一些链接原有的onfocus事件激活函数仍然有效,我们要用一次activeMore()函数;为了能够得到所有的链接,我们用到document.body的onload事件,又要用一次activeMore()函数:

//使链接不出现虚线框:
function blurLinks(){
for(i=0;i activeMore("document.links["+i+"].onfocus=if(this.blur)this.blur()",-1);
}
}
activeMore("document.body.onload=blurLinks()");

  链接的onfocus事件(document.links[i].onfocus)要激活的函数是“if(this.blur)this.blur()”,参数order的值为-1表先激活该函数再激活它们原有的函数;document.body.onload事件要激活的函数是“blurLinks()”,参数order的值省略(或为非负数)表先激活它原有的函数再激活“blurLinks()”。

  从例子中可以看到,这个函数用起来还挺简单吧。有了activeMore()函数,无论多少个事件要激活多个函数,都可以用同样的语法解决了!

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/javascript/) 

来源:https://www.tulaoshi.com/n/20160129/1482627.html

延伸阅读
标签: ASP
  upload.inc <!--------------------- <SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT Function GetUpload(FormData) Dim DataStart,DivStr,DivLen,DataSize,FormFieldData ''分隔标志串(+CRLF) DivStr = LeftB(FormData,InStrB(FormData,str2bin(VbCrLf)) + 1) ''分隔标志串长度 DivLen = LenB(DivStr) PosOpenBoundary = InStrB(FormDa...
标签: Web开发
ff下onmousemove鼠标按不按都是1所以就不能这样用了 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
标签: PHP
  之所以是能写出来这个函数,主要是对该网站的session结构清楚,如:name|s:4:"tasm";passwd|s:6:"111111";mode|s:1:"1",也知道该session存放的位置,而且可以上传文件,所以嘛,当时就做了一次小小的黑客,在线的朋友的密码可以一览无余,呵呵: <? function submit1(){ global $username; print ...
标签: word
Word如何一个括号内插多个编号   个括号内插多个编号 先插一个编号→点击这个编号(这个操作非常重要否则会得到图 中间那种结果)→再插另一个编号得到图 左那样结果 图 一个括号内多个编号(不同结果) 补充话题 在我们行业的杂志中,如果有一处的编号是(2;3;4)那么编辑会要求写成(2-4)--这个问题叫Word怎么做?...
标签: PHP
  前面见到有人发表 但是速度比较慢,也非常长 这里给出一种 function ubb($str) {   $color=Array('red','blue','green'); $str=eregi_replace('\[url\]([a-zA-Z0-9@:%_.~#-\?&]+)\[\/url\]','<a href=http://\\1\\1</a',$str);//url $str=eregi_replace('\[url=http://([a-zA-Z0-9@:%_.~#-\?&]+)\](.+)...

经验教程

708

收藏

6
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部