2010-06-15 2 views
2

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

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

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

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

ТИА

Edit:

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

Код, который работает (не работает в 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); 
. 
. 
. 

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

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

ответ

1
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; 
+0

Спасибо, kennebec, он работает в IE6. Хотя я не знаю, как это работает. – Jamex

+0

@Jamex: Я вижу: в IE я думаю, что 'window.event' сбрасывается после вызова обработчика события, поэтому' srcElement' больше не доступен. –

4

Что-то вроде:

document.onclick = function() { 
    setTimeout(check, 1000); 
}; 
  • Метод setTimeout не возвращает функцию, она возвращает число, которое является Id таймер, который можно использовать в случае, если вы хотите, чтобы отменить таймер до него (с clearTimeout)
  • Вам не нужно использовать строки в качестве первого аргумента, используйте ссылку на функцию.
+0

Привет, это не работает, то функция не получает казнены, ничего не произошло. У вашей функции должны быть скобки() после проверки, чтобы она выполнялась, но все же не было временной задержки. – Jamex

+2

@Jamex: Нет, если вы выполните функцию, возвращаемое значение будет передано как аргумент 'setTimeout', проверьте [этот пример] (http://jsbin.com/eyifi3/2). – CMS

+0

@Jamex, это именно то, что он делает, когда обработчик клика выполняется, 'check' будет вызываться через * секунду позже *, вы видели мой [пример] (http://jsbin.com/eyifi3/2)? Доступна функция 'check' в области, в которой вы используете этот фрагмент? Возможно, вы могли бы опубликовать больше кода, чтобы узнать, где проблема ... – CMS

0
document.onclick = function() { 
    setTimeout("check()",1000); 
}; 

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

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

+0

Жаль, вы не работаете. Проблема в том, что я использую функцию check для получения идентификатора элемента, на который нажата кнопка. Но после задержки нет «памяти» того, на что было нажато, поэтому остальная часть функции не выполняется. – Jamex

+0

Jamex, Не удалось получить элемент с щелчком в начале функции onclick (перед вызовом setTimeout) и передать идентификатор этого элемента для проверки()? – roryhewitt

0

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

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

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

document.onclick = function(e) { 
    function check() { 
     return function() { 
      //do something 
     } 
    } 
    window.setTimeout(check, 1000); 
} 
+0

Спасибо Джейсон, я думаю, что ваша функция действительно работает, за исключением того, что моя функция проверки предназначена для получения идентификатора элемента, на который был нажат. Но после задержки нет памяти о том, на что было нажато, поэтому остальные коды не выполняются, поэтому оказалось, что функция проверки не вызвала. – Jamex

+0

Элемент clicked доступен для 'check()' в 'e.target'. Вот почему у меня есть 'check()' возвращающая функцию, она создает закрытие, которое сохраняет значение 'e' (без передачи' e' в качестве аргумента, который вы не можете сделать) до 'window.setTimeout()' оценивает 'check' и возвращает. – jasongetsdown

+0

Привет, Джейсон, спасибо. моя функция проверки очень длинная, и я потратил 2 дня, пытаясь заставить ее работать. Я не думаю, что знаю достаточно, чтобы начать обертывать свой код вокруг того, что у меня есть. Есть ли способ, которым я могу ввести задержку между двумя строками кодов без использования функции setimeout, функция setimeout требует вызова функции в своих аргументах. Я ищу что-то вроде «delay (1000)»; – Jamex

2

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

// 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); 
+0

Спасибо, Джим, это работает очень хорошо. Я немного понимаю этот код. – Jamex

+0

Вы должны добавить 'var e = e || window.event; 'к этому, иначе это не будет работать в IE. И я подозреваю, что вы попали в неприятности с закрытием таким образом, я не уверен, это слишком поздно здесь. –

+0

Обновлено. Я не думаю, что утечка памяти происходит в IE - там не производится циклическая ссылка. Утечки происходят, когда вы назначаете закрытие свойства элемента DOM, который закрывается над ссылкой на этот элемент. – jimr