问题描述
|
我有一个基本的文本区域:
<textarea id=\'text_comment\'></div>
我有这个功能:
$(\'#text_comment\').live(\'keypress\',function() {
setTimeout(function() {
string = $(this).val();
alert(string);
},500);
});
它应警告textarea中的值,但不警告。
我希望它在500ms之后获得textarea的值,但是如果它在setTimeout
函数内部,则似乎没有设置该变量。
解决方法
因为
setTimeout
是window
的一种方法,所以上下文变为window
\。
$(\'#text_comment\').live(\'keypress\',function() {
var el = this;
setTimeout(function() {
var string = $(el).val();
alert(string);
},500);
});
如果您以这种方式保存对el的引用,则可以依靠它而不是this
而且,您可以只使用el.value
,因为不需要将其包装在jQuery中,而通过by9ѭ在内部进行完全相同的操作
, this
的值在传递给setTimeout的函数内更改。像这样做:
$(\'#text_comment\').live(\'keypress\',function() {
var self = this
setTimeout(function() {
string = $(self).val();
alert(string);
},500);
});
, this
的值取决于当前函数的调用方式。传递给setTimeout
的函数与事件处理程序是不同的函数,因此this
的值是不同的。
首先复印ѭ7。
$(\'#text_comment\').live(\'keypress\',function() {
var that = this;
setTimeout(function() {
string = $(that).val();
alert(string);
},500);
});
, 因为回调不在keypress
事件的范围内运行,而是在全局范围window
中运行。
将引用复制到局部变量,以便将其包含在闭包中:
$(\'#text_comment\').live(\'keypress\',function() {
var element = this;
window.setTimeout(function() {
var string = $(element).val();
alert(string);
},500);
});
, 当“ keypress”事件被触发时,函数中的“ 7”值将是“ 21”对象。但是当运行setTimeout
中的函数(500毫秒后)时,this
的值已更改为其他值(也许是window
对象)
将您的代码更改为:
$(\'#text_comment\').live(\'keypress\',function() {
var textarea = this;
setTimeout(function() {
string = $(textarea).val();
alert(string);
},500);
});