我怎样才能通过“;这个“;进入setTimeout回调
How can I pass "this" into setTimeout callback?
fiddle
代码:
<button onclick="this.disabled=true; setTimeout(function(){this.disabled=false;},500);">click</button>
this
似乎指的是窗口而不是按钮。如何传入按钮对象以便重新启用它?
我知道变通办法。。。我可以给按钮一个ID,然后再抓住它,但我很想知道我是否能以某种方式将this
传入。
this
是由函数的调用方式定义的。
foo.someFunc(); /* this is foo */
foo.bar.someFunc(); /* this is bar */
window.someFunc(); /* this is window */
someFunc(); /* this is window because window is the default */
setTimeout(foo.bar.someFunc, 500); /* this is window because you've passed a function and disassociated it from foo.bar */
如果你想在函数之间传递它,你必须将它复制到另一个变量中。
<button onclick="this.disabled=true; var that = this; setTimeout(function(){that.disabled=false;},500);">click</button>
您可以通过绑定函数来显式设置函数的上下文。
<button onclick="
this.disabled=true;
setTimeout(
function(){this.disabled=false}.bind(this),
500)">click</button>
您会注意到禁用有效,只是启用无效。这是因为this
不是局部变量;当事件处理程序触发时,它就有了正确的含义:不再绑定到按钮。
试试这个:
<button onclick="var self=this; self.disabled=true; setTimeout(function(){self.disabled=false;},500);">click</button>
顺便说一句,尽量避免像这样内联编写代码。为伟大的胜利编写合适的处理程序:
// HTML:
<button id="myBtn">click</button>
// JS:
window.onload = function() {
document.getElementById('myBtn').addEventListener("click", function() {
var self = this;
self.disabled = true;
setTimeout(function() {
self.disabled = false;
}, 500);
}, false);
}
是的,更详细,但最终更易于维护。
jQuery让它变得更容易:
$(function() {
$('#myBtn').click(function() {
var self = this;
self.disabled = true;
setTimeout(function() {
self.disabled = false;
}, 500);
});
});
相关文章:
- 可以't获取具有“t”的对象变量;这个“;由setTimeout()函数调用的对象函数中的属性
- 为什么这个 setTimeout() 方法在这个函数中不起作用
- 这个奇怪的setTimeout语法是什么
- 为什么process.nextTick()在这个“假异步函数”中触发了一个TypeError,而setTimeout()
- setTimeout window.open 不能接受这个.href
- 为什么这个全局计数器变量不适用于 setTimeout
- 不理解这个setTimeout是如何/为什么修复我的IE8问题的
- 不理解JS中的这个setTimeout
- 在setTimeout上使用.apply或.call——如何以跨平台的方式获得这个上下文
- 我如何优化这个调用setTimeout()的递归函数
- setTimeout和这个——最简单的解决方案
- setTimeout是如何在Node.JS上工作的,请解释这个代码片段
- 不能传递参数给这个.settimeout内部的样式
- 我如何从这个casperjs代码中删除堆栈溢出(使用setTimeout)
- 这个javascript setTimeout以一种非常奇怪的方式与ajax请求交互
- 为什么这个setTimeout不工作& &;里面有相关问题
- 为什么这个setTimeout()调用在控制台中工作,而不是作为一个油脂猴子脚本
- 为什么这个setTimeout解决方案不能在javascript中工作
- 这个setTimeout是否会造成任何内存泄漏
- 通过这个.setTimeout中的方法不起作用