Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
document.onclick settimeout函数javascript帮助_Javascript_Settimeout - Fatal编程技术网

document.onclick settimeout函数javascript帮助

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); }; 该方法不返

我有一个document.onclick函数,我想延迟一下。我似乎不能理解正确的语法

我的原始代码是

<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;