如何在jQuery中通过"this"引用JavaScriptclass?
How to reference JavaScript class via "this" within jQuery?
考虑以下 JavaScript class、属性 和方法:
function Foo() {
this.data = 123;
}
Test.prototype.foo = function() {
$("body").append($("<div>")
.text("Hello World!")
.click(function () {
alert("Data: " + this.data);
})
);
}
var Bar = new Foo();
Bar.foo();
为什么 属性 data
在警告框中未定义?如何引用 "this",指向 Foo
class 而不是 jQuery div
元素?
问题是事件处理程序中的 this
指的是处理程序所针对的元素;您可以使用闭包变量来保存对象引用,例如
Test.prototype.foo = function () {
var self = this;
$("body").append($("<div>")
.text("Hello World!")
.click(function () {
alert("Data: " + self.data);
}));
}
或者您可以使用 $.proxy()/Function.bind()
等方法将自定义执行上下文传递给处理程序方法
Test.prototype.foo = function () {
$("body").append($("<div>")
.text("Hello World!")
.click($.proxy(function () {
alert("Data: " + this.data);
}, this)));
}
原因很简单。由于您在 jquery 元素的点击事件回调中访问 this
,因此 this
指向发生事件的元素。
您可以更改代码并稍作更改以使其正常工作,请检查下面的 jsfiddle。
http://jsfiddle.net/satyagupta/efohyekq/
Test.prototype.foo = function() {
var data = this.data; // <--- Add this line
$("body").append($("<div>")
.text("Hello World!")
.click(function () {
alert("Data: " + data);
})
);
}
考虑以下 JavaScript class、属性 和方法:
function Foo() {
this.data = 123;
}
Test.prototype.foo = function() {
$("body").append($("<div>")
.text("Hello World!")
.click(function () {
alert("Data: " + this.data);
})
);
}
var Bar = new Foo();
Bar.foo();
为什么 属性 data
在警告框中未定义?如何引用 "this",指向 Foo
class 而不是 jQuery div
元素?
问题是事件处理程序中的 this
指的是处理程序所针对的元素;您可以使用闭包变量来保存对象引用,例如
Test.prototype.foo = function () {
var self = this;
$("body").append($("<div>")
.text("Hello World!")
.click(function () {
alert("Data: " + self.data);
}));
}
或者您可以使用 $.proxy()/Function.bind()
等方法将自定义执行上下文传递给处理程序方法Test.prototype.foo = function () {
$("body").append($("<div>")
.text("Hello World!")
.click($.proxy(function () {
alert("Data: " + this.data);
}, this)));
}
原因很简单。由于您在 jquery 元素的点击事件回调中访问 this
,因此 this
指向发生事件的元素。
您可以更改代码并稍作更改以使其正常工作,请检查下面的 jsfiddle。
http://jsfiddle.net/satyagupta/efohyekq/
Test.prototype.foo = function() {
var data = this.data; // <--- Add this line
$("body").append($("<div>")
.text("Hello World!")
.click(function () {
alert("Data: " + data);
})
);
}