`
lin_yike
  • 浏览: 18965 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

window.attachEvent 实现 window.load多个函数

阅读更多
以前写 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。
分享到:
评论

相关推荐

    attachEvent和addEventListener 使用方法

    此外,`loadevent.html` 文件可能包含一个关于页面加载事件的示例,例如使用 `window.onload` 或 `DOMContentLoaded` 事件来确保元素加载完成后执行某些操作。在IE中,可以使用 `attachEvent` 添加 `window.onload` ...

    一些常用且实用的原生JavaScript函数.docx

    为了支持多个回调,可以创建一个兼容的函数: ```javascript function iLoad(func) { var oLoad = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload...

    PHP下ajax跨域的解决方案之window.name实例分析

    在这个示例中,`loadfunc`函数负责处理加载事件。第一次加载时,它将`iframe`指向`www.b.com/data.html`;当`iframe`内容加载完成后,再次触发`loadfunc`,这次将`iframe`指向`proxy.html`,然后读取并解析`window....

    用JavaScript事件串连执行多个处理过程的方法

    JavaScript事件串连执行多个处理过程...使用JavaScript事件串连执行多个处理过程的方法可以使用`attachEvent`和`addEventListener`方法来实现。但是,需要根据浏览器的不同,选择合适的方法,并注意执行顺序的随机性。

    页面中body onload 和 [removed] 冲突的问题的解决

    1.使用attachEvent给onload添加所需运行的函数 代码如下:if (document.all) { window.attachEvent(‘onload’, FuncName) } else { window.addEventListener(‘load’, FuncName, false); } 2.使用[removed] = ...

    javaScript和jQuery自动加载简单代码实现方法

    如果需要添加多个事件处理,可以使用 `attachEvent`(IE)或 `addEventListener`(非 IE): ```javascript // IE window.attachEvent("onload", function() { alert('a'); }); window.attachEvent("onload", ...

    JS 页面自动加载函数(兼容多浏览器)

    测试通过: ie6 + opera + FF + chrome 代码如下:if (document.all) { window.attachEvent(‘onload’, arewrite); window.attachEvent(‘onload’, jsStock); } else { window.addEventListener(‘load’, arewrite,...

    在服务端(Page.Write)调用自定义的JS方法详解

    在这个例子中,我们定义了一个`LoadCompleted`函数,当`window.onload`事件触发时,`loadComplete`变量被设置为`true`。然后,`ShowMessage`函数会在每次`setInterval`调用时检查`loadComplete`,只有当页面加载完成...

    js_demo1.zip

    此外,`window.location`对象用于处理当前页面的URL,`window.history`管理浏览器的历史记录,`window.setTimeout()`和`window.clearTimeout()`用于设置和清除定时执行的函数。 4. **JavaScript 事件**: 事件是...

    LazyLoad 图片懒加载

    - **兼容性**:正如描述中提到的,这个实现应该兼容IE6+,这意味着它可能使用了JavaScript的跨浏览器解决方案,如`attachEvent`和`DOMContentLoaded`事件来确保在所有浏览器中正常工作。 - **初始加载**:为了防止...

    javascript 处理事件绑定的一些兼容写法

    首先,让我们看一个基本的事件绑定函数的实现。这个函数`addEvent`接受三个参数:目标对象`obj`,事件类型`type`,以及事件处理函数`fn`。它会检查浏览器是否支持`addEventListener`方法,这是W3C标准的事件处理方式...

    ie事件捕获控件 捕获ie浏览器到打开链接等等的事件

    4. **跨窗口通信**:当需要与外部程序交互时,控件可能利用`window.postMessage`或`window.attachEvent`等API实现不同窗口间的数据传递。 5. **安全性**:确保对捕获到的事件进行安全处理,防止XSS(跨站脚本攻击)...

    原生JS实现动态加载js文件并在加载成功后执行回调函数的方法

    原生JS提供了一种方法来实现这个需求,同时允许在脚本加载成功后执行特定的回调函数。以下将详细介绍这一过程。 首先,我们需要创建一个新的`&lt;script&gt;`元素,通过`document.createElement('script')`来完成。然后,...

    js中DOM事件绑定分析.docx

    这些方法接受三个参数:事件类型、回调函数和一个布尔值,决定事件是冒泡还是捕获。 ```javascript window.addEventListener('load', function() { alert('Lee'); }, false); window.removeEventListener('load...

    domReady的实现案例

    这段代码通过`addEventListener`和`attachEvent`来监听`DOMContentLoaded`和`load`事件,当DOM准备就绪时,将`readList`中存储的回调函数依次执行。`flag`变量用于确保`domReady`只执行一次。如果浏览器支持`...

    DHTML 事件

    这些事件可以通过`addEventListener`和`removeEventListener`方法更灵活地添加和移除,以支持多个事件处理函数,并允许在不兼容的老版本浏览器中使用`attachEvent`和`detachEvent`。 了解并熟练运用DHTML事件,能够...

    ASP.NET与IE11兼容性解决方法

    window.attachEvent("onload", function() { Page_Load(); }); ``` 其中`Page_Load`是你的页面加载事件。 3. **更新浏览器定义文件**:压缩包中的“App_Browsers”文件夹可能包含了针对IE11的浏览器定义文件...

    JAVASCRIPT加载XML文档及操作XML文档的方法[归类].pdf

    在Firefox中,需要编写自定义函数来实现类似功能,如`getXmlText()`和`getXml()`。 示例代码: ```javascript function getXmlText(oNode) { if (oNode.text) return oNode.text; // IE var sText = ""; for ...

    让html元素随浏览器的大小自适应垂直居中的实现方法

    因此,这里采用了防抖(debounce)技术,通过`setTimeout`延迟执行`divMiddle`函数,确保在多次`onresize`事件之间只执行一次,提高页面性能。 总的来说,实现HTML元素随浏览器大小自适应垂直居中,需要结合CSS布局和...

    javascript 基础教程精选.docx

    包括点击事件`click`、鼠标移动`mousemove`、页面加载`load`等,可通过`addEventListener()`或`attachEvent()`绑定事件。 12. **浏览器对象属性**: 比如`window.location`用于获取或修改URL,`document.title`...

Global site tag (gtag.js) - Google Analytics