eventHandler

时间:2015-10-26 14:38:20

标签: javascript jquery

我有这个全局函数,它接受一个配置对象来显示参数$.dialog

这是来源

function close() {
    $(this).dialog('close').remove();
};
function modal(options) {
    var opt = {
        'modal': true,
        'width': 400,
        'close': close,
        'buttons': options.buttons || { Ok: close }
    };
    var dialog = $('<div>')
    .attr('id', 'dialog')
    .attr('title', options.title || 'Info')
    .append($('<p>').text(options.content));
    $('body').append(dialog);
    dialog.dialog(opt);
}

但我希望通过实现一种带有通话方法的小型警报对象来更容易地调用它,以便不编写丑陋的日志配置对象,有点像$.get()$.post()方法

每次创建和销毁dialog的原因是这样做要简单得多,而不是重写现有的。{/ p>

到目前为止,我的问题是我必须记得在每个eventHandler的末尾调用close函数。

所以我的警报对象看起来像这样

var alert = { //the name is work in progress, don't worry
    info: function(text, okHandler){
        modal({
            content: text,
            buttons: {
                Ok: okHandler //here I want to append automatically the close() function
            }
        });
    },
    error: ...
};

我希望像这样称呼它

alert.info('Success!', function(){
    doSomething();
    //then close without me having to remember to do so
});

我想实现的目标是什么?我正在调查Function.prototype.call()方法,但它用于其他用途

2 个答案:

答案 0 :(得分:0)

var alert = { //the name is work in progress, don't worry
    info: function(text, okHandler){
        modal({
            content: text,
            buttons: {
                Ok: function() {
                  okHandler.apply(this);
                  //here I want to append automatically the close() function
                  close.apply(this);
                }
            }
        });
    },
    error: ...
};

答案 1 :(得分:0)

这个问题让我烦恼,因为我似乎还在编写不优雅的代码。我想我现在得到了正确的答案,@ Igor把我送到了正确的方向。

function handler(/*callback*/) {
    var callback = arguments[0];
    return function() {
        if (callback != null) callback.apply(this);
        close.apply(this, arguments);
    };
}

function info(text, okHandler){
    modal({
        title: 'Info',
        content: text,
        buttons: {
            Ok: handler(okHandler),
            Close: close
        }
    });
}

function中返回的handler()的范围将是jQuery eventHandler中的DOM元素,默认情况下会调用close()但不会被调用写了很多次。

此时你甚至可以调用handler()而不是传递close(注意括号)并获得相同的结果。