如何组合类似的事件处理程序

How to combine similar event handlers?

本文关键字:事件处理 程序 何组合 组合      更新时间:2023-09-26

我有两组几乎相同的事件处理程序。有没有一种方法可以将它们组合起来,使代码更加DRY?

CCD_ 1只是指向DOM元素的指针/引用。

请注意,我的ID与事件类型不同,因为可能的重复不适用。

    /*set 1
    */
    $(this.E.main).on("click", function () {
        Page.flip('main');
    });
    $(this.E.feed).on("click", function () {
        Page.flip('feed');
    });
    $(this.E.so_button).on("click", function () {
        Backbone.trigger('user_sign_out');
        Pane.flip();
        Page.flip();
        Storage.clear();
    });
    /* set 2
    */
    $(this.E.main_nav).on("click", function () {
        Page.flip('main');
    });
    $(this.E.feed_nav).on("click", function () {
        Page.flip('feed');
    });
    $(this.E.so_button_nav).on("click", function () {
        Backbone.trigger('user_sign_out');
        Pane.flip();
        Page.flip();
        Storage.clear();
    });

您可能更棘手,只需迭代对象

var valid = ['main', 'feed', 'so_button']; // in case there are other props in object
$.each(this.E, function(key, value) {
    if ( valid.indexOf(key) !== -1 || valid.indexOf(key + '_nav') !== -1 ) {
        $(this.E[key]).on('click', function() {
            if ( key.indexOf('so_button') !== -1 ) {
                Backbone.trigger('user_sign_out');
                Pane.flip();
                Page.flip();
                Storage.clear();
            } else {
                Page.flip(key)
            }
        });
    }
});

您可以使用逗号,分隔符和方括号[]组合多个选择器,并使用$(this)引用当前单击的对象:

$([this.E.main, this.E.feed, this.E.main_nav, this.E.feed_nav]).on("click", function () {
    Page.flip($(this).attr('name'));
});
$([this.E.so_button, this.E.so_button_nav]).on("click", function () {
    Backbone.trigger('user_sign_out');
    Pane.flip();
    Page.flip();
    Storage.clear();
});

希望这能有所帮助。

您可以创建一个实用程序javascript函数/对象,该函数/对象为事件中的每个例程都有一个方法。一个衬垫仍然是一个衬垫,并且4个衬垫将变成一个衬垫。您并没有大幅减少代码量,但维护会更好,未来的可维护性也会更好,尤其是当向一行代码中添加更多逻辑时。

尝试这个

var mainId = "#" + this.E.main.id;
var mainNavId = "#" + this.E.main_nav.id;
$(mainId + "," + mainNavId ).on("click", function () {
    Page.flip('main');
});