document.onclick settimeout函数javascript帮助
我有一个document.onclick函数,我想延迟一下。我似乎不能理解正确的语法 我的原始代码是document.onclick settimeout函数javascript帮助,javascript,settimeout,Javascript,Settimeout,我有一个document.onclick函数,我想延迟一下。我似乎不能理解正确的语法 我的原始代码是 <script type="text/javascript"> document.onclick=check; function check(e){do something} 谢谢大家 更新:kennebec的解决方案适用于IE6。类似于: document.onclick = function () { setTimeout(check, 1000); }; 该方法不返
<script type="text/javascript">
document.onclick=check;
function check(e){do something}
谢谢大家
更新:kennebec的解决方案适用于IE6。类似于:
document.onclick = function () {
setTimeout(check, 1000);
};
- 该方法不返回函数,而是返回一个数字,这是您可以使用的计时器Id,以防在计时器启动前取消计时器(使用
)clearTimeout
- 您不需要使用字符串作为第一个参数,而是使用函数引用
这应该可以…您需要调用
window.setTimeout()
另外,window.setTimeout()
采用函数引用,因此无需在check
周围加引号。添加引号会对带引号的字符串执行eval()
,这既慢又不必要
这应该行得通
document.onclick = function(e) {
function check() {
return function() {
//do something
}
}
window.setTimeout(check, 1000);
}
您可以创建一个泛型函数来生成延迟事件处理程序。例如
// Delay execution of event handler function "f" by "time" ms.
function makeDelayedHandler( f, time)
{
return function( e )
{
var ev = e || window.event;
setTimeout( function()
{
f( ev );
}, time );
};
}
function check( e )
{
// Your original handler
}
document.onclick = makeDelayedHandler( check, 1000 );
嗨,这不起作用,函数没有执行,什么也没有发生。您的函数在执行检查后需要有括号(),但仍然没有时间延迟。@Jamex:不,如果您执行该函数,返回值将作为
setTimeout
,check的参数传递。@Jamex,这正是它所做的,当执行单击处理程序时,check
将在一秒钟后被调用,你看见我的眼睛了吗?在您使用此代码段的范围内是否有检查
功能?也许你可以发布更多的代码来看看问题出在哪里…@CMS,对不起,但是你的函数确实有效(在我放了一些警告语句之后)。问题是我使用函数检查来获取被单击元素的id。但是在延迟之后,单击的内容没有“内存”,因此函数的其余部分不会执行。@Jamex,请发布如何获取元素的id,我怀疑您可能在这个
值上有问题……抱歉,您的函数确实工作。问题是我使用函数检查来获取被单击元素的id。但是在延迟之后,没有被点击的内容的“内存”,因此函数的其余部分不会被执行。Jamex,你能在onclick函数的开头(调用setTimeout之前)检索被点击的元素并将该元素的ID传递给check()?谢谢Jason,我认为你的函数可以工作,除了我的check函数被设计用来获取被点击元素的id之外。但是在延迟之后,没有被点击的内容的内存,因此其余的代码不会被执行,这就是为什么它看起来好像没有调用check函数。点击的元素可用于e.target
中的check()
。这就是为什么我要check()
返回一个函数,它创建一个闭包,保留e
的值(不将e
作为参数传递,这是您不能做的),直到window.setTimeout()
计算check
并返回。嗨,Jason,谢谢。我的检查功能非常长,我花了两天时间试图让它工作。我认为我知道的还不够多,无法开始用我所拥有的来包装你的代码。有没有一种方法可以在不使用settimeout函数的情况下在两行代码之间引入延迟,settimeout函数需要在其参数中调用函数。我正在寻找类似“delay(1000);”的东西,简而言之,不是。setTimeout
是正确的方法。如果您的check()
函数只将事件对象作为其参数,就像在示例中一样,那么您应该能够简单地粘贴函数体来代替//执行某些操作。(请注意,我对我的示例做了一点编辑)。我想您可能会被这样一个事实弄糊涂了:您不能在窗口.setTimeout
中用函数引用传递参数。如果你用我的例子,你不必这么做e
在运行时将可用于check()
,因为它是在e
可用的范围内定义的。这叫做“结束”。谢谢你,jimr,这很有效。我对这段代码有点了解。您应该附加vare=e | | window.event代码>这样做,否则它在IE中就不起作用了。我怀疑你会以这种方式遇到闭包的麻烦,我不确定,现在已经太晚了。更新。我认为IE中不会发生内存泄漏-没有循环引用。当您将闭包分配给一个DOM元素属性,该属性关闭对该元素的引用时,就会发生泄漏。/Marcel,您是对的,原始函数不适用于IE6(未使用其他IE进行测试)。当前的函数也不能与IE6一起使用;我原以为在闭包中引用外部函数的变量时也会出现内存泄漏(如本例中的ev
),但我不确定。谢谢kennebec,它在IE6中工作。虽然我不知道它是如何工作的。@Jamex:Ah,我看到:在IE中,我认为window.event
在调用事件处理程序后被重置,因此srcelment
不再可用。
document.onclick = function () {
setTimeout(check, 1000);
};
document.onclick = function() {
setTimeout("check()",1000);
};
function check() {
alert("I'm baaaaaack!");
}
document.onclick = function(e) {
function check() {
return function() {
//do something
}
}
window.setTimeout(check, 1000);
}
// Delay execution of event handler function "f" by "time" ms.
function makeDelayedHandler( f, time)
{
return function( e )
{
var ev = e || window.event;
setTimeout( function()
{
f( ev );
}, time );
};
}
function check( e )
{
// Your original handler
}
document.onclick = makeDelayedHandler( check, 1000 );
window.twotimer=function(e){
if(arguments[1]!= 'timer'){
// If the 'timer' argument was not passed,
// the function was called from the event,
// so call it again with a timer
e= window.event || e;
var target= e.target || e.srcElement;
setTimeout(function(){return twotimer(target,'timer')},1000);
if(e.stopPropagation) e.stopPropagation();
e.cancelBubble=true;
return false;
}
// if you get to this point, e is the element node clicked
// a second ago-
// put your function body here, using e for the element clicked
alert(e.nodeName+' id='+ e.getAttribute('id')+'\nwas clicked a second ago');
}
document.onclick= twotimer;