this.variable = NaN inside jquery's click()
this.variable = NaN inside jquery's click()
html:
<div id="mydiv">lol</div>
javascript:
var oWM = new WM();
oWM.Add("mydiv");
oWM.Initialize();
function WM() {
this.ZIndex = 1000;
this.Windows = [];
this.Add = function(id) {
this.Windows.push(id);
}
this.Initialize = function() {
for (var i = 0; i < this.Windows.length; i++) {
$("#" + this.Windows[i]).click(function () {
alert("#"+this.id + ":" + this.ZIndex++);
$("#" + this.id).css("z-index", this.ZIndex++);
});
}
}
}
当用户单击div时,我会得到this.ZIndex的"Nan",所以我的更改ZIndex-on-click函数不起作用。为什么它没有得到认可,我该如何让它发挥作用?
我认为这与jquery的$()函数有关,因为this.Windows[I]在该块内也是未定义的。
http://jsfiddle.net/79sM8/
点击"lol"div,看看会发生什么
提前感谢
因为在单击事件内部,this
是您单击的元素,而不是WM对象。
最简单的修复方法是提前bind
点击函数的this
值:
$("#" + this.Windows[i]).click(function () {
alert("#"+this.id + ":" + this.ZIndex++);
$("#" + this.id).css("z-index", this.ZIndex++);
}.bind(this);
EDIT-原来您想读取被单击元素的id
属性,所以在这种情况下,以上内容可能不起作用,因为您仍然需要this.id
来引用dom元素的id。
当然要学习如何使用function.bind,但对于这个问题,下面的解决方案就是你想要的
当然,这在IE8(没有填充程序)中是不起作用的,所以如果这是一个问题,你可以提前保存WM对象的this
值,并在点击处理程序中使用
this.Initialize = function() {
var self = this;
for (var i = 0; i < this.Windows.length; i++) {
$("#" + this.Windows[i]).click(function () {
alert("#"+ this.id + ":" + self.ZIndex++);
$("#" + this.id).css("z-index", self.ZIndex++);
});
}
}
单击处理程序中的变量'this'的作用域是单击的元素,而不是WM对象。您应该将WM对象缓存在单击处理程序之外。这样,您就可以在单击处理程序的范围内使用它。
var oWM = new WM();
oWM.Add("mydiv");
oWM.Initialize();
function WM() {
this.ZIndex = 1000;
this.Windows = [];
this.Add = function(id) {
this.Windows.push(id);
}
this.Initialize = function() {
var that = this;
for (var i = 0; i < this.Windows.length; i++) {
$("#" + this.Windows[i]).click(function () {
alert("#"+this.id + ":" + that.ZIndex++);
$("#" + this.id).css("z-index", that.ZIndex++);
});
}
}
}
this
上下文设置为触发事件的DOM元素。因此,单击处理程序中的this
将引用其中一个Window
元素。
为了解决这个问题,您应该保留一个引用原始this
作用域的局部变量,并在处理程序中使用它:
this.Initialize = function() {
var self = this;
for (var i = 0; i < this.Windows.length; i++) {
$("#" + this.Windows[i]).click(function () {
alert("#"+this.id + ":" + self.ZIndex++);
$(this).css("z-index", self.ZIndex++);
});
}
}
或者,您可以使用Function.prototype.bind
在事件处理程序上强制设置正确的this
上下文,尽管该方法在ECMA-262中是新方法,并且尚未出现在所有浏览器中。链接的MDN页面提供了更多详细信息。
相关文章:
- Fancybox是否将Click事件静音
- jQuery:.click(function(){(element),collapse('show',f
- 从jQuery调用存储在Variable中的函数
- Angular,表达式{{}}的结果没有插入到ng-click中
- 具有相同类的jquery-click元素
- Ng隐藏在Ng-click元素之外
- document.getElementById(“st”).click();不起作用
- 将Transform和Instance Variable转换为对象的JavaScript数组
- Php variable obj to js
- 无法使以下ng on click outside指令在同一页面上的两个元素上工作
- 将代码放入click函数时出现javascript问题
- 将参数中类似形式的ID传递给函数click()
- 如何在ng-click中传递php对象
- 如何将以下“.click”转换为切换
- AngularJs的ng-click$事件将子元素作为目标传递
- 将Computed PHP Variable传递到jQuery/Ajax表单
- angularjs-bindng-click从jquery动态加载DOM
- jsplumb中的Click事件处理程序丢失“;这个“;对象
- jquery on click事件来显示内容
- this.variable = NaN inside jquery's click()