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

Javascript 注册事件浅析

阅读更多

http://www.jb51.net/article/15557.htm

 

首先是最常规的方法:
 程序代码

<p id="para" title="cssrain demo!" onclick="test()" >test</p>
<script>
function test(){
  alert("test");
}
</script>


当某一天,我们知道JavaScript要跟HTML结构实现分离后,就会改了一种写法:
 程序代码

<p id="para" title="cssrain demo!">test</p>
<script>
function test(){
  alert("test");
}
window.onload = function(){
    document.getElementById("para").onclick = test;
}
</script>


当我们工作越来越久后,有时候我们需要对某个元素绑定多个相同的事件类型:
 程序代码
<p id="para" title="cssrain demo!">test</p>
<script>
function test(){
  alert("test");
}

function pig(){
  alert("pig");
}

window.onload = function(){
     document.getElementById("para").onclick = test;
     document.getElementById("para").onclick = pig;
}
</script>

如果按照上面的写法,我们只能输出第二个函数。
这时候我们需要用到attachEvent方法:
 程序代码

<p id="para" title="cssrain demo!">test</p>
<script>
function test(){
  alert("test");
}

function pig(){
  alert("pig");
}

window.onload = function(){
     document.getElementById("para").attachEvent("onclick",test);
     document.getElementById("para").attachEvent("onclick",pig);
}
</script>


在一段时间内,你并没发现这段代码有任何错误。
某一天,一个名叫firefox的浏览器 闯入你的视野,当我们把这段代码放到firefox中执行后,
发现并不能正常运行。 问题就这样,越来越多,然而作为一名JS程序员,这些都是必须面对的。

为了解决这段代码的平台兼容性问题,我翻翻手册,知道了firefox跟ie的区别:
firefox中注册事件使用:addEventListener方法,同时为了兼容ie,我们必须用到if ... else...
 程序代码

<p id="para" title="cssrain demo!">test</p>
<script>
function test(){
  alert("test");
}

function pig(){
  alert("pig");
}

window.onload = function(){
         var element =  document.getElementById("para");
         if(element.addEventListener){  // firefox  , w3c
                element.addEventListener("click",test,false);
    element.addEventListener("click",pig,false);
         } else {   // ie
    element.attachEvent("onclick",test);
    element.attachEvent("onclick",pig);
         }
}
</script>


此时,代码就可以在多个平台上工作了。

但随着水平的进步,你不满足每次都去判断,你想把这个判断封装起来,以后可以直接调用:
 程序代码

<p id="para" title="cssrain demo!">test</p>
<script>
function test(){
  alert("test");
}

function pig(){
  alert("pig");
}

function addListener(element,e,fn){
     if(element.addEventListener){
          element.addEventListener(e,fn,false);
     } else {
          element.attachEvent("on" + e,fn);
     }
}

window.onload = function(){
         var element =  document.getElementById("para");
         addListener(element,"click",test);
         addListener(element,"click",pig);
}
</script>


至此,作为一个程序员的工作就完了。
中间我们从一个最传统,最基本的写法 , 然后实现Js和HTML的分离,然后又实现对同一个元素注册多个事件,期间,我们发现注册事件的兼容性问题。最后我们对注册事件的方法进行封装,方便以后使用。

 

分享到:
评论

相关推荐

    javascript监听鼠标滚轮事件浅析

    本文主要探讨了如何使用JavaScript来监听和处理鼠标滚轮事件,并考虑到不同浏览器的兼容性问题。具体内容包括了滚轮事件监听的原理、不同浏览器下的事件差异、事件监听的代码实现以及如何在不同浏览器中判断滚轮滚动...

    浅析JavaScript回调函数应用_.docx

    2. **DOM事件**:当DOM事件触发时,可以注册回调函数进行处理。 3. **setTimeout和setInterval**:这两个函数的延迟执行特性使得它们成为回调函数的经典应用场景,特别是当延迟时间为0时,用于模拟微任务的执行。 4....

    浅析如何利用JavaScript进行语音识别

    这里操作实际会让用户授权页面开启麦克风,如果用户允许的话,用户可以开始说话了,如果你停说话了,onresult注册的时间 则会被触发,并会讲捕获的音频返回成一个JavaScript对象。 二、响应流 你需要等待用户准备好...

    【JavaScript源代码】vue2.03.0的响应式原理及区别浅析.docx

    4. v-for的ref现在不会注册为数组,而是作为独立引用。 5. 生命周期钩子`destroyed`和`beforeDestroy`分别被重命名为`unmounted`和`beforeUnmount`,以更准确地反映其功能。 6. `&lt;template&gt;`标签现在被视为普通元素...

    flex与js交互浅析.docx

    JavaScript调用Flex方法的步骤首先是注册Flex中的AS方法为可被JavaScript调用。这通过`ExternalInterface.addCallback`完成: ```xml &lt;![CDATA[ import flash.external.ExternalInterface; public function ...

    浅析html input 等值改变添加监听事件

    在JavaScript代码中注册事件监听器,需要使用`addEventListener`方法,而非`attachEvent`方法。`attachEvent`方法主要用于IE浏览器,而`addEventListener`方法则广泛应用于其他现代浏览器,包括Mozilla系列。`...

    浅析Javascript ES6中的原生Promise

    Promise的核心在于它的then方法,它允许我们注册一组回调函数来处理不同的状态。`promise.then`接受两个参数,第一个参数是处理成功的回调,第二个参数是处理错误的回调。例如: ```javascript promise.then...

    深入浅析Node.js 事件循环

    每个事件对应一个主题(Subject),而所有注册到这个事件上的处理函数则相当于观察者(Observer)。Node.js 内置了多个事件,通过引入 events 模块并实例化 EventEmitter 类,开发者可以轻松地创建事件和绑定监听器。...

    关于axios如何全局注册浅析

    为了解决这个问题,我们可以将 Axios 全局注册到 Vue 的原型上,使得在任何组件中都可以直接调用 Axios。 首先,我们来看如何实现这个过程。在项目的入口文件,通常是 `main.js`,我们需要引入 Vue 和 Axios: ```...

    node.js的旅游网站设计浅析-网站设计-设计.pdf

    Node.js 旅游网站设计浅析 Node.js 是一个基于 JavaScript 的服务器端 runtime 环境,最近几年来, Node.js 技术已经得到广泛应用, Node.js 的异步非阻塞 I/O 处理机制,使其在网站开发中具有显著的优势。本文将...

    浅析node.js中close事件

    Node.js是基于Chrome V8引擎的JavaScript运行环境,它使用事件驱动、非阻塞I/O模型,非常适合构建可扩展的网络应用。在Node.js中,http模块用于处理HTTP服务器端和客户端的逻辑。http.ServerResponse对象代表了一个...

    浅析Vue下的components模板使用及应用

    在组件化开发中,我们可以定义自己的组件,这些组件可以通过 `components` 选项注册到 Vue 实例。例如,局部组件的创建方式如下: ```html &lt;haha&gt;&lt;/haha&gt; ``` ```javascript let vm = new Vue({ el: "#app", ...

    浅析AngularJs HTTP响应拦截器.docx

    在AngularJS中,拦截器是通过服务工厂注册到`$httpProvider`的`interceptors`数组中的。以下是一个简单的示例: ```javascript angular.module("myApp", []) .factory('httpInterceptor', ['$q', '$injector', ...

    浅析vue component 组件使用

    "浅析Vue Component 组件使用" Vue Component 组件是 Vue.js 框架中的一种核心概念,它允许开发者将用户界面拆分成小的、可重用的部分,使得代码更加模块化和易于维护。下面是对 Vue Component 组件使用的详细分析...

    编写轻量ajax组件02--浅析AjaxPro

    在页面加载时,使用`AjaxPro.Utility.RegisterTypeForAjax`方法注册当前页面对象的类型。这样做可以在前端生成对应的脚本,使得页面对象的方法能够被异步调用。示例代码如下: ```csharp protected void Page_Load...

    浅析document.ready和[removed]的区别讲解

    这是因为`onload`事件覆盖了`document.ready`,除非你正确管理这些事件的注册。 总结来说,`document.ready`和`window.onload`是两种处理页面加载的不同策略。理解它们的区别并根据实际需求选择合适的方法,对于...

Global site tag (gtag.js) - Google Analytics