对象属性在事件处理程序中未定义

时间:2013-06-11 03:16:18

标签: javascript jquery prototype

出于某种原因,当我调用generateTabs时,我得到了这个.divRow1是未定义的。 但是,当我实例化Criteria时,它并不是未定义的。

我做错了什么?

function Criteria() {
    this.divPortfolio = $("#portfolio_div");
    this.divImport = $("#lstimprt_div");
    this.rolling = $('#rolling');
    this.datePickers = $("#datepickers");
    this.dateStart = $("#datepicker");
    this.dateEnd = $("#datepicker2");
    this.btnToggle = $("#toggle");
    this.btnRun = $("#run_report");
    this.divRow1 = $("#Row1");
    this.dateChoice = $("#datechoice");
    this.minDate = $(".minDate");
}

Criteria.prototype.generateToggle = function () {
        /** Toggle button toggle elements chosen open/closed **/
        button.click(function () {
            this.divRow1.toggle("slow");
            this.divImport.toggle("slow");
            $("#mindate_div").toggle("slow");
            $("#header_row").toggle("slow");
            return false; //Stops postback
        });
    };

    /** When page loads  **/
    $(document).ready(function () {
        var controls = new Criteria();
        var mindate = controls.minDate.html();
        controls.onloadHide();
        controls.generatePicker(controls.dateStart);
        controls.generatePicker(controls.dateEnd);
        controls.generateToggle(controls.btnToggle);
    });   

3 个答案:

答案 0 :(得分:1)

这是因为回调方法的执行上下文不是Criteria对象,而是点击的按钮。

对此的一个解决方案是使用$.proxy()

传递自定义执行上下文
button.click($.proxy(function () {
    this.divRow1.toggle("slow");
    this.divImport.toggle("slow");
    $("#mindate_div").toggle("slow");
    $("#header_row").toggle("slow");
    return false; //Stops postback
}, this));

另一个解决方案是使用闭包变量

var that = this;
button.click(function () {
    that.divRow1.toggle("slow");
    that.divImport.toggle("slow");
    $("#mindate_div").toggle("slow");
    $("#header_row").toggle("slow");
    return false; //Stops postback
});

答案 1 :(得分:1)

button.click(function () {
        this.divRow1.toggle("slow");
        this.divImport.toggle("slow");
        $("#mindate_div").toggle("slow");
        $("#header_row").toggle("slow");
        return false; //Stops postback
    });

this在click事件中的范围与其外部不同。具体来说,jQuery会将此绑定到事件被触发的项目(在本例中为按钮)。如果您设置断点并在此时检查开发控制台中的this,您将看到它引用了DOM元素。

你可以通过设置这样的自变量并引用它来解决这个问题。

Criteria.prototype.generateToggle = function () {
    var self = this;
    /** Toggle button toggle elements chosen open/closed **/
    button.click(function () {
        self.divRow1.toggle("slow");
        self.divImport.toggle("slow");
        $("#mindate_div").toggle("slow");
        $("#header_row").toggle("slow");
        return false; //Stops postback
    });
};

答案 2 :(得分:0)

Criteria.prototype.generateToggle = function () {

        var that = this; 
        /** Toggle button toggle elements chosen open/closed **/
        button.click(function () {

            that.divRow1.toggle("slow");
            that.divImport.toggle("slow");
            $("#mindate_div").toggle("slow");
            $("#header_row").toggle("slow");
            return false; //Stops postback
        });
    };

按钮点击内的“this”上下文已更改。试试上面的