`
haiyang5210
  • 浏览: 7488 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

JavaScript执行window.onload和body onload多个处理过程的方法

阅读更多
以前写 JavaScript 脚本时,事件都是采用
object.event = handler;
的方式初始化。这种方式对于 Internet Explorer、Mozilla/Firefox 和 Opera 来说很通用。但是有一个问题就是,这种方式只能一个事件对应一个事件处理过程。如果希望一个事件可以依次执行多个处理过程就不好用了。

但是 Internet Explorer 从 5.0 开始提供了一个 attachEvent 方法,使用这个方法,就可以给一个事件指派多个处理过程了。attachEvent 对于目前的 Opera 也适用。但是问题是 Mozilla/Firefox 并不支持这个方法。但是它支持另一个 addEventListener 方法,这个方法跟 attachEvent 差不多,也是用来给一个事件指派多个处理过程的。但是它们指派的事件有些区别,在 attachEvent 方法中,事件是以 “on” 开头的,而在 addEventListener 中,事件没有开头的 “on”,另外 addEventListener 还有第三个参数,一般这个参数指定为 false 就可以了。




因此要想在你的程序中给一个事件指派多个处理过程的话,只要首先判断一下浏览器,然后根据不同的浏览器,选择使用 attachEvent 还是 addEventListener 就可以了。实例如下:

Java代码
if (document.all) {  
window.attachEvent('onload', handler1);  
window.attachEvent('onload', handler2);  
}  
else {  
window.addEventListener('load', handler1, false);  
window.addEventListener('load', handler2, false);  


if (document.all) {
window.attachEvent('onload', handler1);
window.attachEvent('onload', handler2);
}
else {
window.addEventListener('load', handler1, false);
window.addEventListener('load', handler2, false);
}


注意:attachEvent 所指派的多个过程的执行顺序是随机的,所以这几个过程之间不要有顺序依赖。另外 attachEvent 和 addEventListener 不仅仅适用于 window 对象,其他的一些对象也支持该方法。

另外为了方便我也写了个function sunet_addEvent(obj, evType, fn),如下:


Java代码
function sunet_addEvent(obj, evType, fn)  
{  
if (obj.addEventListener){  
obj.addEventListener(evType, fn, false);  
return true;  
}else if (obj.attachEvent){  
var r = obj.attachEvent("on"+evType, fn);  
return r;  
}else{  
return false;  
}  


function sunet_addEvent(obj, evType, fn)
{
if (obj.addEventListener){
obj.addEventListener(evType, fn, false);
return true;
}else if (obj.attachEvent){
var r = obj.attachEvent("on"+evType, fn);
return r;
}else{
return false;
}
}
// 调用例子:Java代码
sunet_addEvent(window,"locad",init); 

sunet_addEvent(window,"locad",init);


JavaScript中的5种事件使用方式解说(转)
为组件提供事件处理入口,可以极大的提高组件的封闭性,同时又能让组件很好的和外界通信。并且这也是我们已经习惯使用的一种开发模式,.NET、DHTML等都提供了一套完整的事件处理模型。下面是关于使用DHTML中事件的一个总结。

    DHTML提供了3种事件的使用方式,它们分别是:

    1、Inline HTML: <ELEMENT onXXX='handler'></ELEMENT>
    这是最简单最常用的事件绑定方式,不过这里onXXX的值为handler是不太确切的说法。其实这个handler的位置可以放置任何合法的JavaScript语句,因为IE在生成DHMTL树时会为当前Element构建一个'匿名'成员方法,onXXX指向这个方法的handler。比如我们写下,<element id='elmt' onXXX='var abc =0; for ( var i=0 ; i < 100 ; i++ ) abc+=i;'></element>,实际上在DHMTL树种存在如下代码结构: function anonymous()
{
    var abc =0; for ( var i=0 ; i < 100 ; i++ ) abc+=i;
}
    此时anonymous方法中的this就是elmt对象。

    2、Event property: object.onXXX = handler
    这个使用方法是把函数名(handler)赋予element预定义的事件属性上(onXXX)。这里需要注意两个问题:
    一是,我们在使用object.onXXX = handler是需要保证object已经在页面中生成。比如我们为document.body赋予事件处理函数,我们必须保证document.body已经存在,就是说我们不能在<body>之前在的全局语句中使用document.body;
    二是,handler必须是函数名,和使用方法1中的handler可以是任何JavaScript语句不同!我们最容易出错的使用是,当我们习惯了在inline html中使用<element id='elmt' onXXX = 'return false'></element>后,如果这样使用elmt.onXXX='return false;'。那么就歇菜了,不会有任何执行效果,当然IE也不报错。正确的使用是:

elmt.onXXX = function() { return false; }

    3、Named Script: <SCRIPT FOR = object EVENT = onclick>
    IE独家支持,没有怎么使用过,不觉得有什么特别的地方哈。如果您知道它的妙处愿闻其详。

    DOM提供了两种事件处理使用,它们分别是:

    1、attachEvent method:
    使用方法:bSuccess = object.attachEvent(sEvent, fpNotify)。解释就抄msdn了
    Parameters
       sEvent Required. String that specifies any of the standard DHTML Events.
       fpNotify Required. Pointer that specifies the function to call when sEvent fires.
    Return Value
         Boolean. Returns one of the following possible values:        true The function was bound successfully to the event.
       false The function was not bound to the event.
    DOM提供的这个事件附加方式实际上是一个集合操作,我们可以多次的向同一个事件签名上attach多个事件处理函数,比如:

window.attachEvent('onload', handler1);
window.attachEvent('onload', handler2);
window.attachEvent('onload', handler3);
window.attachEvent('onload', handlerN);
    将会执行这个N个handler,但是不保证执行顺序。这里有个例外,attachEvent在document.body上attach事件'onload'没有效果,但是attch window对象的'onload'是正确的。根据页面初始化顺序来看,及document.body.attachEvent('onload', handler)返回true来看,这因该是IE的一个bug。

    注意DHTML的Event Property方式和DOM的attachEvent方式的区别:

    Event Property方式,当触发事件时,事件处理函数是一个无参数函数,我们只能通过event这个window的属性来读取和事件相关的信息。attachEvent方式,当事件处理函数被触发时,该函数的第一个参数arguments[0],默认是该窗口上的event。什么意思呢?不明白参看这里。

如果你在页面上做一次点击例如点击一个按钮,那么你是首先点击了该按钮然后动作传入了按钮的容器,最后传入整个页面Document还是首先点击了页面Document,然后是按钮的容器,最后导致按钮的点击呢?
   JavaScript对这种问题的处理方式可以称之为事件流即事件的传播机制。对于事件流IE跟FF有不同的解释。IE下的解决方案称之为:冒泡型事件,而FF下称之为:捕获型事件。顾名思义冒泡型事件是从低而上的触发机制,而捕获型事件则是从上到下的触发机制。《JavaScript高级程序设计》一书提到:
   DOM事件流同时支持两种事件触发机制,但是捕获型事件先发生。注意因为事件的目标(也就是DOM树最深的节点)是最精确的元素,实际上它会连续接收两次事件,一次是在捕获过程中,一次是在冒泡过程中。事情到底是不是这样呢?观察下面的程序:
  <html onclick=" clickHandle('html'); ">
   <head>
   <title>JAVASCRIPT事件流</title>
   <meta http-equiv="content-type" content="text/html; charset=GBK">
   <script type="text/javascript">
   function clickHandle(ele){
   alert(ele);
   }
   </script>
   </head>
   <body onclick=" clickHandle('body'); ">
   <div style="bgcolor:red" onclick=" clickHandle('div'); ">click me!</div>
   </body>
  </html>
  IE:点击 click me 运行顺序为:DIV-->BODY-->HTML 点击页面其他部分:BODY-->HTML
  FF: 点击 click me 运行顺序为:DIV-->HTML-->BODY 点击页面其他部分:HTML-->BODY
   呵呵,好像跟书上说的不太一样哦!程序的运行结果告诉我们:不管是在IE下还是在FireFox下,事件总是由最精确的元素(也就是DOM树中最深的节点)首先触发,然后才开始IE下的冒泡和FireFox下的捕获。
   JavaScript为我们提供了三种事件处理函数的分配方式,第一种就像上面的程序一样,是在HTML代码中分配事件处理函数。
  第二种方法是在JavaScript中分配事件处理函数,这种方法首先必须得获得要分配事件处理函数的元素的引用,参考以下程序:
  1 window.onload = function(){
  2 var oDiv = document.getElementById("contentDiv");
  3 oDiv.onclick = function(){
  4 alert(oDiv.innerHTML);
  5 }
  6 }就像上面提到的,该方法在分配事件处理函数时必须保证已经获得对该元素的引用,所以这个程序才把oDiv的onclick事件放在了onload事件的内部,否则会报oDiv未被定义。还有一个需要注意的地方是使用这种事件处理函数的分配方式时只能为某个特定的事件分配一个函数且事件函数的签名必须小写,否则前面分配的函数会被后面的函数所覆盖,如果想为同一个事件分配两个以上的处理函数,需要采用第三种事件处理函数分配方式。
   在IE中我们使用obj.attachEvent()方法为某个元素分配函数,使用obj.detachEvent()方法为某个元素分离事件处理函数,而在DOM(以FireFox为例)中我们使用addEventListener()方法分配函数,使用removeEventListener()方法分离函数。
   参考一下代码:
  1 window.onload = function(){
  2 var oDiv = document.getElementById("contentDiv");
  3 var func1 = function(){
  4 alert(oDiv.innerHTML);
  5 }
  6 var func2 = function(){
  7 alert("also " + oDiv.innerHTML);
  8 }
  9 //IE
  10 if(oDiv.attachEvent){
  11 oDiv.attachEvent("onclick",func1);
  12 oDiv.attachEvent("onclick",func2);
  13 //oDiv.detachEvent("onclick",func1);
  14 } else if(oDiv.addEventListener){
  15 //FireFox
  16 oDiv.addEventListener("click",func1,true);
  17 oDiv.addEventListener("click",func2,true);
  18 //oDiv.removeEventListener("click",func1,true);
  19 }
  20
  21 }我们来说明一下IE下与FireFox下这种事件处理函数的不同点:
  1、在函数的第一个参数中,IE下必须有"on"做为前缀,而FF下不用,两种情况下处理函数签名必须小写。
  2、FireFox下的addEventListener()函数的第三个参数表示的是:true表示在捕获阶段增加事件处理函数,false表示在冒泡阶段增加事件处理函数,但是由于FireFox不支持冒泡事件流,所以这里我们设成True或者Flase好像没什么区别。但是要注意的一点就是,如果在 addEventListener()中第三个参数设为true,那么在removeEventListener()方法中的第三个参数一定也要设为相同的值,否则方法失效。
  3、在运行时阶段,IE首先执行的是最后边一个被增加的事件处理函数然后才是倒数第二个以此类推,但是在FireFox下与IE相反,他会按照事件处理函数的添加顺序执行。
分享到:
评论
1 楼 haiyang5210 2011-05-16  
http://www.everbox.com/f/VObO2Ruw2T4uyAVEq14ehHppDl

相关推荐

    ie中 body onload 和 window onload 解决法案

    在网页开发中,`body.onload` 和 `window.onload` 是两个常见的JavaScript事件处理函数,用于在页面完全加载后执行特定的代码。它们都是用来确保在执行任何操作之前,页面的所有资源(包括HTML、CSS、JavaScript、...

    window.open()参数

    window.open() 是一个常用的 JavaScript 函数,它可以打开一个新的浏览器窗口,以供用户访问其他网页或显示信息。在本文中,我们将详细介绍 window.open() 函数的参数大全,并提供一些实用的代码示例。 基本语法 ...

    网页中JS函数自动执行常用三种方法_.docx

    这种方法可以在页面加载完成后执行多个函数。 JQ 方法 如果我们使用 jQuery 库,那么可以使用 `$(document).ready()` 事件来自动执行 JS 函数。例如: ```javascript $(document).ready(function() { $("table tr...

    javaScript的对象window

    在JavaScript代码中,我们可以直接调用`window`对象的许多属性和方法,而不必显式地写出`window`前缀。例如,通常我们使用的`document.write()`实际上就是`window.document.write()`的简写形式。然而,对于某些特定...

    js中window.open()的所有参数详细解析.docx

    window.open() 是 JavaScript 中的一个函数,用于打开新的浏览器窗口或标签页。在实际开发中,我们经常需要对新打开的窗口进行自定义设置,如设置窗口的尺寸、位置、工具栏、菜单栏等。本文将详细介绍 window.open()...

    JQuery-- onload,ready方法详细解说

    在 JavaScript 库中,JQuery 提供了两种事件处理机制,即 onload 和 ready。它们都是在页面加载完成后触发的事件,但是它们之间有着一定的区别。 首先,我们需要了解这两种事件的触发时机。在页面加载完成后,会...

    javascript经典特效---无提示自动关闭窗口.rar

    JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它主要负责处理客户端的交互和动态效果。在"无提示自动关闭窗口"这个经典特效中,我们主要探讨的是如何使用JavaScript来实现一个窗口在用户没有进行任何...

    100多个很有用的JavaScript函数以及基础写法汇总

    以上就是从给定文件中提取的部分JavaScript基础知识和函数,这些内容涵盖了变量声明、数据类型转换、DOM操作、事件处理等多个方面,对于初学者和进阶开发者都非常有用。理解并掌握这些知识点,能够帮助你更好地编写...

    JavaScript代码helloWorld1

    本文将对 JavaScript 代码 Hello World 1 进行详细解释,涵盖 HTML、JavaScript、事件处理等多个方面。 HTML 结构 首先,让我们看一下 HTML 结构 &lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;...&lt;/head&gt;&lt;body&gt;...&lt;/body&gt;。这是一...

    获取页面长宽和滚动条的位置

    &lt;!...&lt;html xmlns="http://www.w3.org/1999/xhtml" &gt; &lt;script type="text/javascript"&gt; function GetPageSize() { var scrW, scrH; if(window.innerHeight && window....&lt;body onload="main();"&gt; &lt;/body&gt; &lt;/html&gt;

    莱鸟介绍window.print()方法

    `window.print()` 方法是JavaScript中的一个内置函数,主要用于调用浏览器的打印功能。这个方法允许开发者无须离开网页或应用即可让用户打印网页内容,非常适合于那些需要提供打印选项的网站。在本文中,我们将深入...

    用JS(javascript)从另一个html中读取标题和正文body

    创建一个新的Worker,并在Worker中读取和处理文件,然后通过消息传递回主线程。 6. **IFrame通信**: - 如果目标HTML文件和当前页面在同一域下,可以将目标HTML加载到一个隐藏的IFrame中,然后通过`window.frames`...

    ReactNative的自动高度webview_JavaScript_下载.zip

    总的来说,`react-native-autoheight-webview-master`可能提供了一个完整的解决方案,包括处理Webview自动高度的React组件和配合使用的JavaScript代码片段。通过理解和使用这个组件,开发者可以轻松地在ReactNative...

    用meta实现的页面跳转代码

    总结来说,`&lt;meta&gt;`标签和JavaScript都可以实现页面跳转,但JavaScript提供了更多控制和交互的可能性,如延迟跳转、用户确认等。在实际应用中,可以根据项目需求和用户体验来选择合适的方法。同时,为了兼容性和可靠...

    javascript页面跳转常用代码.pdf

    在JavaScript中,页面跳转和刷新是常见的操作,主要应用于网页交互、用户导航以及数据更新等场景。下面将详细介绍这些方法和技巧。 首先,我们来看一下JavaScript刷新页面的几种方式: 1. `history.go(0)`:这个...

    在HTA窗口显示前调整其尺寸的方法 | #hta #javascript

    总结起来,本文主要讲述了如何使用JavaScript在HTA启动时调整窗口的尺寸和位置,这包括了`window.resizeTo()`和`window.moveTo()`这两个方法的使用。实际的代码示例可能在提供的“demo.hta”文件中,通过查看和分析...

    jquery 教程 详细解释了jquery的使用方法

    可复用性:页面中可以有多个`$(document).ready()`,每个都会执行,而`window.onload()`只执行最后一个定义的函数。 掌握以上内容,你就能开始使用jQuery进行基本的网页交互和动态效果的实现了。随着进一步的学习...

    JavaScript 的性能优化:加载和执行.docx

    JavaScript 是Web开发中不可或缺的一部分,尤其在Web2.0时代,JavaScript在客户端处理大量任务,因此它的性能优化至关重要。浏览器中的JavaScript执行具有阻塞特性,意味着在执行脚本时,浏览器无法进行其他操作,如...

    网页javascript 精华代码集.doc

    JavaScript是网页开发中不可或缺的一部分,尤其对于交互性的增强和用户体验的提升起到了重要作用。在这个"网页JavaScript精华代码集"中,主要介绍了几个关于弹出窗口的JavaScript实现方式,这对于网页开发者来说是...

    javascript函数的解释

    这个例子实现过程为:,开始计时-----判断(小于5秒则返回继续计时)----提交按钮恢复为可用。…………分解完了,再为每步写好实现代码; 第一步:倒计时 我们先设定一个初始时间值6秒:var t=6; 然后每过一秒t-1; ...

Global site tag (gtag.js) - Google Analytics