首頁 web前端 js教程 JavaScript中自訂事件用法分析_javascript技巧

JavaScript中自訂事件用法分析_javascript技巧

May 16, 2016 pm 04:25 PM
javascript 事件 用法 自訂

本文實例講述了JavaScript中自訂事件用法。分享給大家供大家參考。具體分析如下:

在web前端開發中,很多人可能不會用到js的自訂事件,但如果是做一個相對來說比較大的項目,尤其是多人協同開發的時候,自訂事件就顯得很重要了。那麼,什麼是js中的自訂事件呢?我們先來看一個例子:
前端開發員A封裝了一個函數:

複製程式碼 程式碼如下:
function move(){
    alert(a);  //以此代表N行程式碼
}

過段時間,前端開發員B要在A的基礎上豐富這個函數,於是,他會這樣寫:
複製程式碼 程式碼如下:
function move(){
    alert(a);  //以此代表N行程式碼
    alert(b);  //以此代表N行程式碼
}

是不是發現了問題,B要注意和A的變數、函數等等的命名和衝突問題,又過段時間,前端開發員C也要豐富這個函數,於是:
複製程式碼 程式碼如下:
function move(){
    alert(a);  //以此代表N行程式碼
    alert(b);  //以此代表N行程式碼
    alert(c);  //以此代表N行程式碼
}

這時候會很令人抓狂了,C寫起程式碼來我敢肯定不會很輕鬆。解決這個問題的方法是透過自訂事件,我們知道一個元素身上可以添加相同的事件而不會各自影響,如:
複製程式碼 程式碼如下:
window.addEventListener('click',function(){
    alert(1);
} ,false);
window.addEventListener('click',function(){
    alert(2);
} ,false);

點擊頁面的時候,1和2都會彈出,那我們就可以用這種方法定義我們的函數:
複製程式碼 程式碼如下:
window.addEventListener('move',function(){
    alert(3);
} ,false);
window.addEventListener('move',function(){
    alert(4);
} ,false);

這樣,我們執行move();的時候就會彈出3和4,這裡的move就是自訂事件,它其實就是一個函數

下面看看如何給事件處理程序傳遞參數:

複製程式碼 程式碼如下:
//將有參數的函數封裝為無參數的函數
function createFunction(obj, strFunc) {
    var args = [];       //定義args 用於儲存傳遞給事件處理程序的參數
    if (!obj) obj = window; //如果是全域函數則obj=window;
    //得到傳遞給事件處理程序的參數
    for (var i = 2; i     //用無參數函數封裝事件處理程序的呼叫
    return function() {
        obj[strFunc].apply(obj, args); //傳遞參數給指定的事件處理程序
    }
}
function class1() {
}
class1.prototype = {
    show: function() {
        this.onShow();
    },
    onShow: function() { }
}
function objOnShow(userName) {
    alert("hello," userName);
}
function test() {
    var obj = new class1();
    var userName = "test";
    obj.onShow = createFunction(null, "objOnShow", userName);
    obj.show();
}

"因為事件機制只傳遞一個函數的名稱,不帶有任何參數的信息,所以無法傳遞參數進去",這是後話了,「要解決這個問題,可以從相反的思路去考慮,不考慮怎麼把參數傳進去,而是考慮如何建立一個無需參數的事件處理程序,該程序是根據有參數的事件處理程序創建的,是一個外層的封裝。函數,它巧妙地利用apply函數將帶參數的函數封裝為無參數函數。最後我們來看看如何實作自訂事件的多重綁定:

複製程式碼 程式碼如下:
// 讓自訂事件支援多重綁定
//將有參數的函數封裝為無參數的函數
function createFunction(obj, strFunc) {
    var args = [];       //定義args 用於儲存傳遞給事件處理程序的參數
    if (!obj) obj = window; //如果是全域函數則obj=window;
    //得到傳遞給事件處理程序的參數
    for (var i = 2; i     //用無參數函數封裝事件處理程序的呼叫
    return function() {
        obj[strFunc].apply(obj, args); //傳遞參數給指定的事件處理程序
    }
}
function class1() {
}
class1.prototype = {
    show: function() {
        if (this.onShow) {
            for (var i = 0; i                 this.onShow[i]();
            }
        }
    },
    attachOnShow: function(_eHandler) {
        if (!this.onShow) { this.onShow = []; }
        this.onShow.push(_eHandler);
    }
}
function objOnShow(userName) {
    alert("hello," userName);
}
function objOnShow2(testName) {
    alert("show:" testName);
}
function test() {
    var obj = new class1();
    var userName = "your name";
    obj.attachOnShow(createFunction(null, "objOnShow", userName));
    obj.attachOnShow(createFunction(null, "objOnShow2", "test message"));
    obj.show();
}

我們看到,attachOnShow方法實現的基本思想是對數組的push操作,其實我們還可以在事件執行完成之後,移除事件處理函數,下面單獨實現:
複製程式碼 程式碼如下:
//將有參數的函數封裝為無參數的函數
function createFunction(obj, strFunc) {
    var args = [];       //定義args 用於儲存傳遞給事件處理程序的參數
    if (!obj) obj = window; //如果是全域函數則obj=window;
    //得到傳遞給事件處理程序的參數
    for (var i = 2; i     //用無參數函數封裝事件處理程序的呼叫
    return function() {
        obj[strFunc].apply(obj, args); //傳遞參數給指定的事件處理程序
    }
}
function class1() {
}
class1.prototype = {
    show: function() {
        if (this.onShow) {
            for (var i = 0; i                 this.onShow[i]();
            }
        }
    },
    attachOnShow: function(_eHandler) { // 附加事件
        if (!this.onShow) { this.onShow = []; }
        this.onShow.push(_eHandler);
    },
    detachOnShow: function(_eHandler) { // 移除事件
        if (!this.onShow) { this.onShow = []; }
        this.onShow.pop(_eHandler);
    }
}

function objOnShow(userName) {
    alert("hello," userName);
}
function objOnShow2(testName) {
    alert("show:" testName);
}
function test() {
    var obj = new class1();
    var userName = "your name";
    obj.attachOnShow(createFunction(null, "objOnShow", userName));
    obj.attachOnShow(createFunction(null, "objOnShow2", "test message"));
    obj.show();
    obj.detachOnShow(createFunction(null, "objOnShow", userName));
    obj.show(); // 移除一個,顯示剩餘的一個
    obj.detachOnShow(createFunction(null, "objOnShow2", "test message"));
    obj.show(); // 兩個都移除,一個也不顯示
}

希望本文所述對大家的javascript程式設計有所幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1268
29
C# 教程
1248
24
如何在Netflix中快速設定自訂頭像 如何在Netflix中快速設定自訂頭像 Feb 19, 2024 pm 06:33 PM

Netflix上的頭像是你串流媒體身分的視覺化代表。使用者可以超越預設的頭像來展現自己的個性。繼續閱讀這篇文章,了解如何在Netflix應用程式中設定自訂個人資料圖片。如何在Netflix中快速設定自訂頭像在Netflix中,沒有內建功能來設定個人資料圖片。不過,您可以透過在瀏覽器上安裝Netflix擴充功能來實現此目的。首先,在瀏覽器上安裝Netflix擴充功能的自訂個人資料圖片。你可以在Chrome商店買到它。安裝擴充功能後,在瀏覽器上開啟Netflix並登入您的帳戶。導航至右上角的個人資料,然後點擊

Eclipse中自訂快捷鍵設定的方法 Eclipse中自訂快捷鍵設定的方法 Jan 28, 2024 am 10:01 AM

如何在Eclipse中自訂快捷鍵設定?身為開發人員,在使用Eclipse進行編碼時,熟練快捷鍵是提高效率的關鍵之一。 Eclipse作為一個強大的整合開發環境,不僅提供了許多預設的快捷鍵,還允許使用者根據自己的偏好進行個人化的客製化。本文將介紹如何在Eclipse中自訂快捷鍵設置,並給出具體的程式碼範例。打開Eclipse首先,打開Eclipse,並進入

解析JSP註解的使用方法和分類 解析JSP註解的使用方法和分類 Feb 01, 2024 am 08:01 AM

JSP註解的分類及用法解析JSP註解分為兩種:單行註解:以結尾,只能註解單行程式碼。多行註解:以/*開頭,以*/結尾,可以註解多行程式碼。單行註解範例多行註解範例/**這是一段多行註解*可以註解多行程式碼*/JSP註解的用法JSP註解可以用來註解JSP程式碼,使其更易於閱

edius自訂螢幕佈局的操作流程 edius自訂螢幕佈局的操作流程 Mar 27, 2024 pm 06:50 PM

1.下圖是edius預設的螢幕佈局,預設的EDIUS視窗佈局是橫向版式,因此在單一顯示器環境中,許多視窗是重疊在一起的,且預覽視窗為單一視窗模式。 2、您可以透過【檢視】選單列啟用【雙視窗模式】,使預覽視窗同時顯示播放視窗和錄製視窗。 3.您可以透過【檢視功能表列>視窗佈局>常規】來恢復預設螢幕佈局。另外您也可以自訂適合您的佈局方式,並儲存為常用螢幕佈局:將視窗拖曳成適合自己的佈局,然後點擊【檢視>視窗佈局>儲存目前佈局>新建】,在彈出的【儲存目前佈局】小視窗中輸入佈局名稱,按確定

WPSdatedif函數的用法 WPSdatedif函數的用法 Feb 20, 2024 pm 10:27 PM

WPS是一款常用的辦公室軟體套件,其中的WPS表格功能被廣泛用於資料處理和計算。在WPS表格中,有一個非常有用的函數,即DATEDIF函數,它用於計算兩個日期之間的時間差。 DATEDIF函數是英文單字DateDifference的縮寫,它的語法如下:DATEDIF(start_date,end_date,unit)其中,start_date表示起始日期

如何正確使用C語言的exit函數 如何正確使用C語言的exit函數 Feb 18, 2024 pm 03:40 PM

c語言exit函數怎麼用,需要具體程式碼範例在C語言中,我們常常需要在程式中提前終止程式的執行,或是在某個特定的條件下退出程式。 C語言提供了exit()函數來實作這個功能。本文將介紹exit()函數的用法,並提供對應的程式碼範例。 exit()函數是C語言中的標準函式庫函數,它包含在頭檔中。它的作用是終止程式的執行,並且可以帶一個整數

MySQL ISNULL 函數詳解及用法介紹 MySQL ISNULL 函數詳解及用法介紹 Mar 01, 2024 pm 05:24 PM

MySQL中的ISNULL()函數是用來判斷指定表達式或列是否為NULL的函數。它傳回一個布林值,如果表達式為NULL則回傳1,否則回傳0。 ISNULL()函數可以在SELECT語句中使用,也可以在WHERE子句中進行條件判斷。 1.ISNULL()函數的基本語法:ISNULL(expression)其中,expression是要判斷是否為NULL的表達式或

excel怎麼自訂x軸和y軸? (excel座標軸刻度如何自訂) excel怎麼自訂x軸和y軸? (excel座標軸刻度如何自訂) Mar 14, 2024 pm 02:10 PM

  在excel表格中,有時候可能需要插入座標軸,能夠更直觀地看到資料的變化趨勢。還有些小夥伴不清楚怎麼在表中插入座標軸,接下來小編就跟大家分享一下excel自訂座標軸刻度的方法吧。  座標軸插入方法:  1、在excel介面中,選取資料。  2、在插入介面中,點選插入長條圖或長條圖。  3、在展開的介面中,選擇形圖類型。  4、在表格右鍵介面中,點選選擇資料。  5、在展開的介面中,進行自訂即可。

See all articles