js自訂事件(一)的目的只是讓大家簡單的理解自定事件是如何模擬出來的,大家不難發現會有很多缺陷,比如:
1、此事件物件只能註冊一個事件,不能提供多個事件
2、註冊方法沒有回傳的一些資訊
下面我們就來解決這些問題。如下為MyEvent.js原始碼:
functionEvent( {
this.handlers={};
}
MyEvent.prototype={
addHandler:function(type,handler)
{
if(typeof this.handlers[type] =="undefined")
{
this.handlers[type]=[];
}
this.handlers[type].push(handler);
},
fire:function(event)
{if(this.handlers[event.type] instanceof Array)
{
var handlers=this.handlers[event.type];
for(var i= 0, len=handlers.length;i
handlers[i](event);
}
}
},
removeHandler:function(type ,handler)
{
if(this.handlers[type] instanceof Array)
{
var handlers=this.handlers[type];
for(var i= 0, len= handlers.length;i
if(handlers[i]===handler)
{
break;
}
}
handlers. splice(i,1);
}
}
};
這類就是第一篇的最佳化。
屬性handler變成了handlers,變成了一個陣列
addHandler()方法接受兩個參數:事件類型和用於處理該事件的函數。當方法呼叫時,會進行一次檢查,看看handlers屬性中是否已經存在一個針對該事件類型的陣列
;如果沒有,則建立一個新的。然後使用push()將該處理程序加入到陣列的末尾。
fire()方法用來觸發一個事件,該方法接受一個參數,是一個至少包含type屬性的對象,不然無法確定handlers裡面是否已經存在。它會透過此type去尋找對應該事件類型的一組處理程序,呼叫各個函數,並給出event物件。因為這些都是自訂對象,所以event對像上面的其他東西可以由你自己定義。
removeHandler()方法時addHandler()的輔助,它們接受的參數一樣:事件的類型和事件處理程序。這個方法搜尋事件處理程序的陣列找到要刪除的處理程序的位置。如果找到了,則使用break運算子退出迴圈。然後使用splice()方法將該項目從陣列中刪除。
這裡使用方式我們換一種比較長用的形式,現在據我說知很多產品在使用事件上有兩種方式,一種是直接繼承(js本省沒有此概念,不過我們可以透過原型鏈模擬出繼承的效果,此處不做詳細解釋)此事件對象,那麼就會擁有了這些行為,不過此方法比較局限,另一種方式更常用一些,就是需要使用事件的類別上面創建一個屬性用於存放此物件。如:子相同目錄下再建立一個Student.js文件,裡面的程式碼如下:
function Student(name)
{
this.myEvent=new MyEvent();
this.name=name;
}
Student.prototype={
setName:function(name)
{
var eventStart={
type:"changeNameStart",
newName:name,
oldName:this.name
};
this.myEvent.fire(eventStart);
this.name=name;
}
}
這裡有一個學生類,建構子裡面初始化一個MyEvent物件作為屬性,透過參數初始化name屬性。
提供一個方法setName用來改變名字,不過在改變名字之前設定了可能觸發事件changNameStart的監聽。
建立一個html頁面,放於同目錄下,程式碼如下:
這樣使用起來就會很方便,也是常用的使用方式。
一般在真正的專案裡面使用使用事件時我們還需要做一些最佳化,例如:
1、使用者並不知道我們提供了哪些事件,從程式碼來看好像什麼事件都可以加入到handlers裡面,但是真正起效果的(我們設定fire()方法的地方)事件我們並不能從程式碼裡面很直觀的看出來,一般做產品,在這方面都需要再做考慮。
2、有沒有發現fire的參數event好像沒用固定,在大興項目裡面,最好event也做成一個類型,在fire的地方就比較方便使用一些,event可能會有很多種類型,那時可能fire裡面會出現一些判定了。
希望對初入js事件的讀者有幫助,互相交流。

在win11系统中,我们可以通过打开分屏交互来让多个显示器使用同一款系统,共同操作,但是很多朋友不知道分屏交互怎么开启,其实只要在系统设置中找到显示器就可以了,下面一起来学习一下吧。win11分屏交互怎么打开1、点击开始菜单,找到其中的“设置”2、然后在其中找到“系统”设置。3、进入系统设置后,在左侧选择“显示”4、接着在右边的多显示器中选择“扩展这些显示器”即可。

Vue.js是一款流行的JavaScript框架,它提供了很多方便的特性,所以它在开发Web应用程序时非常有用。Vue.js中的自定义事件系统使其更加灵活,并且可以通过组件事件触发和处理来实现更好的代码重用性。在本文中,我们将讨论如何使用Vue.js的自定义事件。Vue.js中自定义事件的基础在Vue.js中,我们可以通过v-on指令来监听DOM事件。例如,

Vue3+TS+Vite开发技巧:如何与后端API进行交互引言:在网页应用开发中,前端与后端之间的数据交互是一个非常重要的环节。Vue3作为一种流行的前端框架,与后端API进行交互的方式也有很多种。本文将介绍如何使用Vue3+TypeScript+Vite开发环境来与后端API进行交互,并通过代码示例来加深理解。一、使用Axios发送请求Axios是

uniapp实现如何使用JSBridge实现与原生交互,需要具体代码示例一、背景介绍在移动应用开发中,有时需要与原生环境进行交互,比如调用原生的一些功能或获取原生的一些数据。uniapp作为一种跨平台的移动应用开发框架,提供了一种方便的方式来实现与原生交互,即使用JSBridge进行通信。JSBridge是一种前端与移动原生端进行交互的技术方案,通过在前端和

PHP与JavaScript交互的方法及常见问题解答随着互联网的快速发展,网页已经成为人们获取信息、进行交流的主要平台。而PHP和JavaScript是开发网页的两种最常用语言。它们都具有各自的优点和适用场景,而在大型网站的开发过程中,两者的结合将会拓展开发人员的的工作能力。本文将介绍PHP和JavaScript交互的方法及常见问题解答。PHP与JavaSc

随着互联网的迅猛发展和信息技术的日新月异,前端和后端开发作为两个重要的IT领域在过去几十年中也取得了巨大的进步。本文将探讨前端后端开发的发展历程,分析当前的发展趋势,并展望未来的发展方向。一、前端后端开发的发展历程早期阶段在互联网刚刚兴起的时期,网站开发主要关注内容的呈现,前端开发工作主要集中在HTML、CSS和JavaScript等技术上,以实现页面的基本

使用企业微信接口与PHP进行数据交互的方法企业微信是企业内部沟通和协作的重要平台,开发者可以通过企业微信接口实现与企业微信的数据交互。本文将介绍如何使用PHP语言来调用企业微信接口,实现数据的传输与处理。首先,需要创建一个企业微信应用,并获取相应的CorpID、Secret以及AgentID。这些信息可以在企业微信管理后台的“应用与小程序”中找到。接下来,我

WebSocket已经成为了现代Web应用程序中常用的实时通信协议。使用PHP开发WebSocket服务器一般需要使用Swoole这样的扩展,因为它提供了对异步编程、进程管理、内存映射以及其他WebSocket相关特性的支持。在本文中,我们将讨论如何使用Swoole来实现WebSocket服务器与客户端的交互,并提供一些具体的代码示例。Swoole与W


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3漢化版
中文版,非常好用

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境