对象属性在事件处理程序中未定义
Object property is undefined inside event handler
出于某种原因,当我调用generateTabs时,我得到this.divRow1是未定义的。但是,当我实例化标准时,它不是未定义的。
我做错了什么?
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);
});
是因为回
调方法的执行上下文不是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
});
button.click(function () {
this.divRow1.toggle("slow");
this.divImport.toggle("slow");
$("#mindate_div").toggle("slow");
$("#header_row").toggle("slow");
return false; //Stops postback
});
this
在点击事件中的范围与其外部的范围不同。 具体来说,jQuery会将其绑定到触发事件的项(在本例中为按钮(。 如果此时设置断点并在开发控制台中检查this
,你将看到它引用了 DOM 元素。
您可以通过设置这样的 self 变量并引用它来解决此问题。
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
});
};
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"上下文在按钮单击中已更改。尝试上述操作
相关文章:
- 为什么这个函数调用会破坏程序并导致未定义的变量
- importScripts在web工作程序中返回未定义的
- 注入应用程序的角度控制器未定义
- 为什么我的程序提醒未定义的值
- Ionic应用程序在部署后给出ReferenceError:未定义Promise
- 运行此程序后出现错误,未捕获的类型错误:无法读取未定义的属性“推送”
- JSHint 错误:未定义我的应用程序 (W117)
- 尝试从我的 chrome 扩展程序访问 gmail 中的 iframe 时出现未定义的错误,但不是从开发者控制台访问
- 应用程序.js未在开发中加载(未捕获的引用错误:未定义 $)
- Javascript 运行时错误:“应用程序未定义”
- dhtmlx多个调度器不工作错误”;调度程序未定义”;
- 测试Ember.JS应用程序失败,返回ReferenceError:未定义Ember
- 为什么谷歌应用程序脚本抛出'引用错误:“;粗体“;未定义'使用.setBold()时
- Rally应用程序SDK 2.0rc1-未捕获引用错误:未定义集会
- Webpacked Angular2应用程序类型错误:无法读取属性'getOptional'的未定义
- 角度嵌套对象-TypeError:无法读取属性'应用程序'的未定义
- $window错误'$窗口未定义'Angular应用程序中的谷歌分析代码
- React应用程序错误'未捕获的ReferenceError:React未定义'
- "未定义“角度”;在Liferay中存储的角度应用程序上执行Protractor测试时出错
- 当使用 Jasmine 对我的 angularJS 应用程序进行单元测试时,$interval是未定义的