`
fjguodong
  • 浏览: 39888 次
社区版块
存档分类
最新评论

javasript中主动触发事件的方法

阅读更多

对于实现事件触发器,浏览器都有原生的方法来支持,但是在兼容性上又有很大的出入,这种兼容性的问题完全在意料之中,IE有自己的方法,其他标准浏览器也有一套方法,不说谁的方法好与不好,对于WEB开发者来说搞出几套方法就是对开发人员的一种折磨。IE支持fireEvent方法来实现事件触发,标准浏览器支持dispatchEvent来实现事件触发,两面派的IE9是两者都支持。下面是出自prototype.js的源码(其实我是从司徒正美的博客复制过来的):

    var fireEvent = function(element,event){
        if (document.createEventObject){
            // IE浏览器支持fireEvent方法
            var evt = document.createEventObject();
            return element.fireEvent('on'+event,evt)
        }
             else{
            // 其他标准浏览器使用dispatchEvent方法
            var evt = document.createEvent( 'HTMLEvents' );
            // initEvent接受3个参数:
            // 事件类型,是否冒泡,是否阻止浏览器的默认行为
            evt.initEvent(event, true, true); 
            return !element.dispatchEvent(evt);
        }
    };

 上面的方法可以兼容主流的浏览器以实现事件触发器的功能。但是对于一些封装好的事件处理系统,如jQuery的event模块,就没这么简单了,只能通过模拟来实现了。我在之前写过一个很简单的事件处理系统,最近又碰到自定义事件的需求,于是在之前的事件系统的基础上模拟了一个事件触发器,代码如下:

    /**
     * 事件触发器
     * @param { Object } DOM元素
     * @param { String / Object } 事件类型 / event对象
     * @param { Array }  传递给事件处理函数的附加参数
     * @param { Boolean } 是否冒泡
     */
    trigger : function( elem, event, data, isStopPropagation ){
        var type = event.type || event,
            // 冒泡的父元素,一直到document、window
            parent = elem.parentNode ||
                elem.ownerDocument ||
                elem === elem.ownerDocument && win,
            eventHandler = $.data( elem, type + 'Handler' );
 
        isStopPropagation = typeof data === 'boolean' ?
            data : (isStopPropagation || false);
 
        data = data && isArray( data ) ? data : [];
 
        // 创建自定义的event对象       
        event = typeof event === 'object' ?
            event : {
                type : type,
                preventDefault : noop,
                stopPropagation : function(){
                    isStopPropagation = true;
                }
            };
 
        event.target = elem;       
        data.unshift( event );
        if( eventHandler ){
            eventHandler.call( elem, data );
        }
        // 递归调用自身来模拟冒泡
        if( parent && !isStopPropagation ){
            data.shift();
            this.trigger( parent, event, data );
        }
    }

 模拟的原理并不难,给某元素绑定一个事件处理函数,如果有触发事件的实际操作就会执行相应的事件处理函数,所以要达到事件触发器的功能只要获取到相应的事件处理函数然后执行就差不多了,这是最基本的。

在实际的事件发生时浏览器会生成一个event对象,里面包含了一些事件发生时的属性和信息。如果没有实际的事件发生是没有这个event对象的,所以上面的代码也创建了一个event对象满足最基本的功能。

还有事件冒泡,如果没有实际的事件发生,自然也不会有冒泡的行为,那么如果要模拟冒泡的功能,就必须不断的查找父元素并检查是否绑定了相同类型的事件,直至到document和window为止,如果结构复杂,这种递归调用的方法性能估计会不怎么样。

最后是浏览器的默认行为,我觉得这个要去模拟相当麻烦,麻烦到不知如何去实现,比如a标签默认的跳转,我测试了jQuery的trigger,也没有实现,但是一些其他的行为貌似又在API手册中有介绍。毕竟这个功能不是很重要,暂时也没做过多的深究,下面是一些演示。

 

原载于:雨夜带刀’s Blog
本文链接:http://iamxz.com/%E4%B8%BB%E5%8A%A8%E8%A7%A6%E5%8F%91%E4%BA%8B%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95/
如需转载请以链接形式注明原载或原文地址。

尊重文章原作者,转载请注明: 转载自原作者地址

 

分享到:
评论

相关推荐

    jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理

    在本篇文章中,我们将深入探讨事件系统中的主动触发事件和模拟冒泡处理。首先,让我们来看一下`stopPropagation`函数。 `stopPropagation`的作用是阻止事件在DOM树中的冒泡过程,即防止事件向上传播到父元素。在...

    layui问题之模拟select点击事件的实例讲解

    在Web开发中,模拟select元素的点击事件是一项常见的需求,尤其是当我们希望在不直接与页面交互的情况下改变选项值时。本文将通过实例讲解来阐述如何在使用layui框架的情况下,模拟select的点击事件。 ### 标题知识...

    IE中调试javascript

    - **使用场景**:当页面中包含大量动态生成的内容时,通过鼠标悬停或点击页面元素,可以快速查看到与该元素相关的JavaScript代码和事件处理函数,这对于调试JavaScript非常有帮助。 #### 三、启用脚本调试功能 在...

    javascript 主动派发事件总结

    2,fireEvent() 这是IE旧版本中实现的触发事件方法,它无须创建事件对象,直接使用。如下 代码如下: element.fireEvent(‘onclick’); 注意:与attachEvent一样它需要加上“on” 一个兼容性所有浏览器的版本,如下 ...

    JavaScript实用知识库分享

    * 如何实现JS主动触发事件:了解如何实现JS主动触发事件的方法。 * 前端设计模式:了解前端设计模式的使用方法、前端设计模式的应用场景等。 本篇文章涵盖了JavaScript的多方面知识点,希望能够帮助读者更好地理解...

    JS鼠标键盘触发函数大全

    ### JS鼠标键盘触发函数大全知识点解析 #### 一、鼠标事件 鼠标事件是JavaScript中最...以上各类事件为JavaScript中较为常用的事件类型,通过合理利用这些事件,开发者可以构建出更加交互丰富且功能强大的Web应用。

    【JavaScript源代码】vue列表数据删除后主动刷新页面及刷新方法详解.docx

    本文将深入探讨在Vue中如何在列表数据被删除后主动刷新页面。 首先,我们遇到的问题是在前端执行了删除操作,后端确认成功后,前端的视图并没有实时反映出变化。这主要是因为Vue Router的导航守卫和Vue的响应式系统...

    vue element ui validate 主动触发错误提示操作

    以下是如何主动触发错误提示的操作步骤: 1. 首先,你需要通过`$refs`获取到表单实例,例如`this.$refs['form']`。 2. 然后,你可以访问表单字段数组`fields`,找到需要设置错误的字段,例如`fields[0]`。 3. 接...

    基于Websocket 协议,PHP类库 和 javascript类库 , 实现事件+回调函数的架构开发

    6. **JavaScript中的事件和回调**: 在JavaScript客户端,我们可以监听WebSocket对象的事件,如`open`、`message`、`error`等,并通过回调函数来处理这些事件。例如,`socket.addEventListener('message', function...

    javascript实现将文件保存到本地方法汇总

    具体来说,这些函数都是在某种触发事件(如点击事件)之后执行,通过创建一个临时的弹出窗口(使用window.open方法)并在该窗口中执行保存操作(使用document.execCommand("SaveAs")命令)。该方法依赖于浏览器支持...

    dwr实例,JavaScript调用java方法的小例子

    DWR简化了AJAX(Asynchronous JavaScript and XML)应用的开发,使得开发者可以方便地在JavaScript中直接调用Java方法,仿佛它们是本地函数一样。 在"TestDwr"这个压缩包中,我们可以预期包含了一个简单的DWR实例,...

    Qt嵌入IE,与Javascript交互示例

    首先,为QAxWidget对象设置事件槽,然后在JavaScript中触发该事件,从而调用Qt的相应函数。例如,定义一个Qt槽函数: ```cpp void mySlot(const QString &msg) { // 处理JavaScript传递的数据 } connect(browser,...

    npapi插件中插件主动调网页js函数

    标题中的“npapi插件中插件主动调网页js函数”指的是NPAPI(Netscape Plugin Application Programming Interface)插件如何在运行时调用网页中的JavaScript函数。NPAPI是一种允许浏览器加载外部代码来扩展功能的插件...

    CSharp代码与javaScript

    例如,C#的Page_Load事件在页面加载时触发,而JavaScript的DOMContentLoaded或load事件在浏览器解析完HTML和CSS后触发,可用于调用JavaScript函数。 4. **跨域问题与解决方案** 默认情况下,浏览器实施同源策略,...

    angluo-javascript-347795.pdf

    在使用Element UI进行表单验证时,有时我们需要主动触发错误提示,以便在用户未满足特定条件时立即反馈错误信息。本文将详细讲解如何在Element UI中实现这一功能。 首先,Element UI利用async-validator库来进行...

    详解Javascript事件驱动编程

    JavaScript的事件驱动编程是一种基于事件处理的编程范式,它的核心概念是程序不是一直主动运行,而是在等待某些事件发生(例如用户的点击、键盘输入等),在事件发生时触发预先编写好的函数来响应。 1. 事件驱动...

    creator 手动发射事件

    手动发射事件是指开发者在代码中主动触发一个事件,以便通知其他对象某个动作或状态变化的发生。在Cocos Creator中,你可以使用`cc.eventManager.dispatchEvent`方法来实现这一功能。该方法通常包含两个参数:一个是...

    JAVASCRIPT弹出窗口大总结

    1. **安全性**:现代浏览器为了安全考虑,可能会阻止非用户主动触发的弹出窗口。 2. **兼容性**:不同的浏览器对弹出窗口的特性和行为支持可能存在差异。 3. **用户体验**:过度使用弹出窗口可能会影响用户体验,应...

Global site tag (gtag.js) - Google Analytics