嘿程序员,
我有一个基本的textarea:
<textarea id='text_comment'></div>
我有这个功能:
$('#text_comment').live('keypress', function() {
setTimeout(function() {
string = $(this).val();
alert(string);
}, 500);
});
它应该警告textarea中的值,但它不会发出任何警报。
我希望它能在500ms后得到textarea的值,但是如果它在setTimeout函数中,它似乎没有设置变量。
答案 0 :(得分:5)
上下文变为window
,因为setTimeout
是window
的方法。
$('#text_comment').live('keypress', function() {
var el = this;
setTimeout(function() {
var string = $(el).val();
alert(string);
}, 500);
});
如果您以这种方式保存对el的引用,则可以依赖它而不是this
而且,您可以使用el.value
,因为不需要将它包装在jQuery中并在.val()
答案 1 :(得分:1)
this
的值在传递给setTimeout的函数内部发生了变化。这样做:
$('#text_comment').live('keypress', function() {
var self = this
setTimeout(function() {
string = $(self).val();
alert(string);
}, 500);
});
答案 2 :(得分:1)
this
的值取决于当前函数的调用方式。传递给setTimeout
的函数是与事件处理程序不同的函数,因此this
的值不同。
首先制作this
的副本。
$('#text_comment').live('keypress', function() {
var that = this;
setTimeout(function() {
string = $(that).val();
alert(string);
}, 500);
});
答案 3 :(得分:1)
因为回调不是在keypress
事件的范围内运行,而是在全局范围window
中运行。
将引用复制到局部变量,使其包含在闭包中:
$('#text_comment').live('keypress', function() {
var element = this;
window.setTimeout(function() {
var string = $(element).val();
alert(string);
}, 500);
});
答案 4 :(得分:0)
当触发'keypress'事件时,函数中this
的值将为textarea
个对象。但是当setTimeout
中的函数运行时(500毫秒后),this
的值已更改为其他值(可能是window
对象)
将您的代码更改为:
$('#text_comment').live('keypress', function() {
var textarea = this;
setTimeout(function() {
string = $(textarea).val();
alert(string);
}, 500);
});