У меня есть функция document.onclick, которую я хотел бы задержать. Я не могу понять синтаксис правильно.

Мой оригинальный код

<script type="text/javascript">
document.onclick=check;

function check(e){do something}

Я попробовал ниже, но этот код неверен, функция не выполнялась и ничего не произошло.

<script type="text/javascript">
document.onclick=setTimeout("check", 1000);

function check(e){do something}

Я попробовал следующий набор, функция была выполнена, но без задержки.

<script type="text/javascript">
setTimeout(document.onclick=check, 1000);

function check(e){do something}

Какой правильный синтаксис для этого кода.

Tia

Редактировать:

Все решения были хорошими, моя проблема заключалась в том, что я использовал функцию check для получения идентификатора элемента, по которому щелкали. Но после задержки «память» о том, на что нажимали, отсутствует, поэтому остальная часть функции не выполняется. Джимр написал краткий код для сохранения события клика.

Код, который работает (не работает в IE6)

document.onclick = makeDelayedHandler( 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){ 
var click = (e && e.target) || (event && event.srcElement);  
.
.
.

Спасибо вам всем.

Обновление: решение Кеннебека работает для IE6.

2
Jamex 15 Июн 2010 в 22:32

5 ответов

Лучший ответ
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;
1
kennebec 16 Июн 2010 в 01:10

Вам нужно позвонить window.setTimeout().

Кроме того, window.setTimeout() использует ссылку на функцию, поэтому нет необходимости в кавычках вокруг check. Добавление кавычек делает eval() в строке в кавычках, что является медленным и ненужным.

Это должно работать

document.onclick = function(e) {
    function check() {
        return function() {
            //do something
        }
    }
    window.setTimeout(check, 1000);
}
0
jasongetsdown 15 Июн 2010 в 20:38
document.onclick = function() {
    setTimeout("check()",1000);
};

function check() {
    alert("I'm baaaaaack!");
}

Это должно сработать ...

0
roryhewitt 15 Июн 2010 в 18:53

Вы можете сделать универсальную функцию, которая сделает обработчик отложенного события. Например.

// 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 );
2
jimr 16 Июн 2010 в 03:24

Что-то типа:

document.onclick = function () {
  setTimeout(check, 1000);
};
  • setTimeout метод не возвращает функцию, он возвращает число , который является идентификатором таймера, который можно использовать в случае, если вы хотите отменить таймер до его запуска (с clearTimeout)
  • Вам не нужно использовать строки в качестве первого аргумента, используйте ссылку на функцию.
4
CMS 15 Июн 2010 в 18:34