Javascript 带有代理的回调方法中的访问对话框

Javascript 带有代理的回调方法中的访问对话框,javascript,jquery,jquery-ui,Javascript,Jquery,Jquery Ui,我当前正在用户定义类中创建一个对话框: $("<div>").dialog(buttons: { 'one': function () { $(this).dialog('close').dialog('destroy'); } }); 然后,我可以在单击对话框按钮时调用类方法 但是,我仍然需要对dialog元素本身调用.dialog('close').dialog('destroy')。在使用$.proxy重新定义此之后,如何在按钮回调中访问该元素e.目标

我当前正在用户定义类中创建一个对话框:

$("<div>").dialog(buttons: {
   'one': function () {
      $(this).dialog('close').dialog('destroy');
   }
});
然后,我可以在单击对话框按钮时调用类方法

但是,我仍然需要对dialog元素本身调用
.dialog('close').dialog('destroy')
。在使用
$.proxy
重新定义
之后,如何在按钮回调中访问该元素<代码>e.目标指按钮本身

我也意识到我可以这样做:

var obj = this;
...buttons: {
   obj.doWork();

但是我正在寻找一种方法来解决这个问题。

我不知道你为什么要避免
var obj=this
在类的作用域内,但唯一的其他方法是使用自调用闭包,该闭包执行基本相同的操作。为了对两个上下文都有引用,您需要将类引用存储在不同的变量中

结束时:

function MyClass() {
    this.createDialog = function () {
        $("<div>").dialog({
            buttons: {
                "one": function (self) {
                    return  function (e) {
                        self.doWork();
                        $(this).dialog("close").dialog("destroy");
                    };
                }(this)
            }
        });
    };

    this.doWork = function () {
        // do work
    };
}

$(function () {
    var obj = new MyClass();

    $(".createDialog").click(function () {
        obj.createDialog();
    });
});
函数MyClass(){
this.createDialog=函数(){
$(“”)。对话框({
按钮:{
“一”:功能(自我){
返回函数(e){
自我工作();
$(此).dialog(“关闭”).dialog(“销毁”);
};
}(本)
}
});
};
this.doWork=函数(){
//工作
};
}
$(函数(){
var obj=新的MyClass();
$(“.createDialog”)。单击(函数(){
obj.createDialog();
});
});

jsIDLE:

如果您想访问这两个对象,使用
代理
更改上下文
$(e.target)有什么好处。最近('.ui dialog buttonpane')。prev()
将为您提供element@ExplosionPills:var obj=此
解决方案是一种常见做法。可能没有更干净的方法来做它。@ExplosionPills,例如
'one':函数(self){return function(){…};}(this)
。狭窄的scope@eicto:这是因为您将dlg.dialog\u open作为单击处理程序中的直接引用发送,因此它不会在类的上下文中执行。您需要将其包装在匿名函数中。
function MyClass() {
    this.createDialog = function () {
        $("<div>").dialog({
            buttons: {
                "one": function (self) {
                    return  function (e) {
                        self.doWork();
                        $(this).dialog("close").dialog("destroy");
                    };
                }(this)
            }
        });
    };

    this.doWork = function () {
        // do work
    };
}

$(function () {
    var obj = new MyClass();

    $(".createDialog").click(function () {
        obj.createDialog();
    });
});