完美解决一个事件激活多个函数[KnowSky.com]
2005-08-16 19:32
211 查看
如果你的网页中一个“OnLoad”事件要激活两个以上的JavaScript函数,那怎么办呢?小阳曾查阅了不少资料,结果都不尽如人意,无非是程序员根据情况,把要激活的函数统一放在一个函数里激活。
但作为一个程序员,编写的代码的适用性是很重要的。请看下面一个例子:
<BODY OnLoad='alert("这是<BODY>标签调用的函数")'>
<script language="JavaScript">
function myfunction(){
alert("这是JS脚本调用的函数");
}
document.body.onload=myfunction;
</script>
</BODY>
运行后你会发现,它只跳出一个“这是JS脚本调用的函数”的警告框。< BODY>标签中要求激活的函数被“忽略”了。当然你可以运用前面提过的方法,把两个函数放一个函数里激活。但这样有不少弊端,特别是如果把这段JavaScript代码写成一个"myjs.js"文件,要用它的话直接加上< script language="JavaScript" src="myjs.js">< /script>即可,但如果还要在引用文件的页面中根据情况修改标签或者添加一段代码,多麻烦呀。这就降低了代码的适用性了。 可不可以在编写JavaScript代码时就设计好,如果前面OnLoad事件已经有函数要激活,让它仍然激活前面的函数,但同时也激活本段代码所需要的函数?答案是肯定的。我们先看下这段代码:
<BODY OnLoad='alert("这是<BODY>标签调用的函数")'>
<script language="JavaScript">
// document.body.onload是函数(function)型,用toString()函数转为字符串 (string)型:
alert(document.body.onload.toString());
</script>
</BODY>
运行后其中一个警告框中提示:
function anonymous()
{
alert("这是标签调用的函数")
}
发现什么了吗?“document.body.onload.toString()”就是上面这段函数代码!我们这段字符串作为代码的一部分运行,那么我们就多了一个函数“anonymous()”,于是将这个函数和我们现在需要激活的函数一起激活就行了!
下面我们以第一次提到的代码为例进行修改,得到最终代码:
<BODY OnLoad='alert("这是<BODY>标签调用的函数")'>
<script language="JavaScript">
function myfunction(){
alert("这是JS脚本调用的函数");
}
//现在我们要激活的函数是“myfunction()”,原来要激活的函数是<BODY>标签里的“alert()”,
//下面这段代码可以两个一起激活:
myActive="myfunction()";
if(document.body.onload.toString())
{
eval(document.body.onload.toString().replace('anonymous()','bodyload()'));
document.body.onload=new Function("bodyload();"+myActive);
}
else document.body.onload=new Function(myActive);
</script>
</BODY>
上段代码中,变量myActive是JS代码中要激活的函数,eval(string)函数是把其字符串参数当作是JavaScript脚本来运行。我们把document.body.onload.toString()中的“anonymous()”替换为“bodyload()”,得到一个新函数“bodyload()”,它包含了所有原来要激活的函数,再把函数“bodyload()”和我们要激活的函数一起在OnLoad事件中激活。
为什么要把“anonymous()”替换为“bodyload()”呢?因为这个方法适用于所有事件(例如OnMouseOver),而所有事件toString()都是得到“anonymous()”,为了不和其它事件也用了这个方法冲突,我们把它替换掉。在其它事件中也依此替换即可。
好了,我们运行一下最终代码,如你所愿地两个函数都激活了吧?添加的代码也挺简单,有挺强的适用性。
摘自 http://www.knowsky.com/3651.html
但作为一个程序员,编写的代码的适用性是很重要的。请看下面一个例子:
<BODY OnLoad='alert("这是<BODY>标签调用的函数")'>
<script language="JavaScript">
function myfunction(){
alert("这是JS脚本调用的函数");
}
document.body.onload=myfunction;
</script>
</BODY>
运行后你会发现,它只跳出一个“这是JS脚本调用的函数”的警告框。< BODY>标签中要求激活的函数被“忽略”了。当然你可以运用前面提过的方法,把两个函数放一个函数里激活。但这样有不少弊端,特别是如果把这段JavaScript代码写成一个"myjs.js"文件,要用它的话直接加上< script language="JavaScript" src="myjs.js">< /script>即可,但如果还要在引用文件的页面中根据情况修改标签或者添加一段代码,多麻烦呀。这就降低了代码的适用性了。 可不可以在编写JavaScript代码时就设计好,如果前面OnLoad事件已经有函数要激活,让它仍然激活前面的函数,但同时也激活本段代码所需要的函数?答案是肯定的。我们先看下这段代码:
<BODY OnLoad='alert("这是<BODY>标签调用的函数")'>
<script language="JavaScript">
// document.body.onload是函数(function)型,用toString()函数转为字符串 (string)型:
alert(document.body.onload.toString());
</script>
</BODY>
运行后其中一个警告框中提示:
function anonymous()
{
alert("这是标签调用的函数")
}
发现什么了吗?“document.body.onload.toString()”就是上面这段函数代码!我们这段字符串作为代码的一部分运行,那么我们就多了一个函数“anonymous()”,于是将这个函数和我们现在需要激活的函数一起激活就行了!
下面我们以第一次提到的代码为例进行修改,得到最终代码:
<BODY OnLoad='alert("这是<BODY>标签调用的函数")'>
<script language="JavaScript">
function myfunction(){
alert("这是JS脚本调用的函数");
}
//现在我们要激活的函数是“myfunction()”,原来要激活的函数是<BODY>标签里的“alert()”,
//下面这段代码可以两个一起激活:
myActive="myfunction()";
if(document.body.onload.toString())
{
eval(document.body.onload.toString().replace('anonymous()','bodyload()'));
document.body.onload=new Function("bodyload();"+myActive);
}
else document.body.onload=new Function(myActive);
</script>
</BODY>
上段代码中,变量myActive是JS代码中要激活的函数,eval(string)函数是把其字符串参数当作是JavaScript脚本来运行。我们把document.body.onload.toString()中的“anonymous()”替换为“bodyload()”,得到一个新函数“bodyload()”,它包含了所有原来要激活的函数,再把函数“bodyload()”和我们要激活的函数一起在OnLoad事件中激活。
为什么要把“anonymous()”替换为“bodyload()”呢?因为这个方法适用于所有事件(例如OnMouseOver),而所有事件toString()都是得到“anonymous()”,为了不和其它事件也用了这个方法冲突,我们把它替换掉。在其它事件中也依此替换即可。
好了,我们运行一下最终代码,如你所愿地两个函数都激活了吧?添加的代码也挺简单,有挺强的适用性。
摘自 http://www.knowsky.com/3651.html
相关文章推荐
- 完美解决一个事件激活多个函数[KnowSky.com] 选择自 jaketseng 的 Blog
- 完美解决一个事件激活多个函数
- 完美解决一个事件激活多个函数
- 完美解决一个事件激活多个函数
- 完美解决一个事件激活多个函数
- 完美解决一个事件激活多个函数
- [转] HTML完美解决一个事件激活多个函数 (有新意,但实际作用不大)
- 完美解决一个事件激活多个函数
- window.addEventListener来解决让一个js事件执行多个函数
- C# 001 --- 正确的删除一个控件的事件函数 --- 解决错误: “A”不包含“B”的定义,并且找不到可接受类型为“A”的第一个参数的扩展方法“B”(是否缺少 using 指令或程序集引用?)
- window.addEventListener来解决让一个js事件执行多个函数
- window.addEventListener来解决让一个js事件执行多个函数
- window.addEventListener来解决让一个js事件执行多个函数
- window.addEventListener来解决让一个js事件执行多个函数
- window.addEventListener来解决让一个js事件执行多个函数
- js:window.onload事件 让一个js事件执行多个函数
- javascript同一个事件如何注册多个处理函数
- 完美解决listView 文字超链接点击事件和listitem点击事件冲突问题
- 一个小问题: a标签句柄绑定事件时,函数名是search时报错
- Qt使用一个事件队列对所有发出的事件进行维护(QObject的event()函数相当于dispatch函数),用EventLabel 继承QLabel作为例子(简单明了) good