JavaScript中自定义事件用法剖析

日期:2019-09-07编辑作者:关于计算机

本文实例讲述了JavaScript中自定义事件用法。分享给大家供大家参考。具体分析如下:

JavaScript中自定义事件用法分析,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 < arguments.length; i++) args.push(arguments[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();
}

"因为事件机制仅传递一个函数的名称,不带有任何参数的信息,所以无法传递参数进去",这是后话了,“要解决这个问题,可以从相反的思路去考虑,不考虑怎么把参数传进去,而是考虑如何构建一个无需参数的事件处理程序,该程序是根据有参数的事件处理程序创建的,是一个外层的封装。”,这里的“该程序”就是createFunction函数,它巧妙地利用apply函数将带参数的函数封装为无参数函数。最后我们看看如何实现自定义事件的多绑定:

复制代码 代码如下:

// 使自定义事件支持多绑定
//将有参数的函数封装为无参数的函数
function createFunction(obj, strFunc) {
    var args = [];       //定义args 用于存储传递给事件处理程序的参数
    if (!obj) obj = window; //如果是全局函数则obj=window;
    //得到传递给事件处理程序的参数
    for (var i = 2; i < arguments.length; i++) args.push(arguments[i]);
    //用无参数函数封装事件处理程序的调用
    return function() {
        obj[strFunc].apply(obj, args); //将参数传递给指定的事件处理程序
    }
}
function class1() {
}
class1.prototype = {
    show: function() {
        if (this.onShow) {
            for (var i = 0; i < this.onShow.length; 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 < arguments.length; i++) args.push(arguments[i]);
    //用无参数函数封装事件处理程序的调用
    return function() {
        obj[strFunc].apply(obj, args); //将参数传递给指定的事件处理程序
    }
}
function class1() {
}
class1.prototype = {
    show: function() {
        if (this.onShow) {
            for (var i = 0; i < this.onShow.length; 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程序设计有所帮助。

本文实例讲述了JavaScript中自定义事件用法。分享给大家供大家参考。具体分析如下: 在w...

在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 < arguments.length; i++) args.push(arguments[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();
}

"因为事件机制仅传递一个函数的名称,不带有任何参数的信息,所以无法传递参数进去",这是后话了,“要解决这个问题,可以从相反的思路去考虑,不考虑怎么把参数传进去,而是考虑如何构建一个无需参数的事件处理程序,该程序是根据有参数的事件处理程序创建的,是一个外层的封装。”,这里的“该程序”就是createFunction函数,它巧妙地利用apply函数将带参数的函数封装为无参数函数。最后我们看看如何实现自定义事件的多绑定:

复制代码 代码如下:

// 使自定义事件支持多绑定
//将有参数的函数封装为无参数的函数
function createFunction(obj, strFunc) {
    var args = [];       //定义args 用于存储传递给事件处理程序的参数
    if (!obj) obj = window; //如果是全局函数则obj=window;
    //得到传递给事件处理程序的参数
    for (var i = 2; i < arguments.length; i++) args.push(arguments[i]);
    //用无参数函数封装事件处理程序的调用
    return function() {
        obj[strFunc].apply(obj, args); //将参数传递给指定的事件处理程序
    }
}
function class1() {
}
class1.prototype = {
    show: function() {
        if (this.onShow) {
            for (var i = 0; i < this.onShow.length; 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 < arguments.length; i++) args.push(arguments[i]);
    //用无参数函数封装事件处理程序的调用
    return function() {
        obj[strFunc].apply(obj, args); //将参数传递给指定的事件处理程序
    }
}
function class1() {
}
class1.prototype = {
    show: function() {
        if (this.onShow) {
            for (var i = 0; i < this.onShow.length; 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程序设计有所帮助。

您可能感兴趣的文章:

  • js自定义事件及事件交互原理概述(一)
  • js自定义事件及事件交互原理概述(二)
  • JavaScript自定义事件介绍
  • js实现屏蔽默认快捷键调用自定义事件示例
  • 详解JavaScript中的自定义事件编写
  • JavaScript加强之自定义event事件
  • Javascript自定义事件详解
  • js事件模型与自定义事件实例解析
  • javascript自定义事件功能与用法实例分析

本文由今晚最快开奖现场直播发布于关于计算机,转载请注明出处:JavaScript中自定义事件用法剖析

关键词:

浅析Javascript中“==”与“===”的分别

以前使用JavaScript的时候,时一时的会遇到使用 == 和 ===那多少个暗记来判别多个变量是或不是等于。但是对于那八个...

详细>>

主意用法实例

本文实例讲述了jQuery中width()方法用法。分享给大家供大家参考。具体分析如下: 本文实例讲述了jQuery中html()方法用法...

详细>>

调用JavaScript对象的办法集锦

明天在做项目时,境遇了亟待创设JavaScript对象的情况。所以Bing了一篇老外写的关于3种创建JavaScript对象的稿子,看后...

详细>>

jQuery基础语法实例入门

正文实例叙述了jQuery基础语法。共享给大家供大家仿效。具体剖析如下: jQuery基础语法实例入门,jquery语法实例 本文...

详细>>