2013-03-17 5 views
0

Функция asyncMsg вызывается сразу же при нажатии кнопки запуска запуска. Как изменить вызов, только когда пользователь нажимает кнопку нажатия на кнопку. Мне нужно передать 2 элемента данных в этот обратный вызов.Почему этот обратный вызов не называется асинхронно

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<script type="text/javascript"> 

function bindEvent(el, eventName, eventHandler) { 
    if (el.addEventListener){ 
     el.addEventListener(eventName, eventHandler, false); 
    } else if (el.attachEvent){ 
     el.attachEvent('on'+eventName, eventHandler); 
    } 
} 

function asyncMsg(data, fldid) { 
    alert("asynchronous message with param1=" + data + " param2=" + fldid); 
} 

function dohooking() { 
    var toinsert = "Duck"; 
    var fldid = "10"; 
    var btn = document.getElementById("hookee"); 
    bindEvent(btn, 'click', asyncMsg(toinsert, fldid)); 
} 

</script> 

<title></title> 

</head> 
<body> 

<input type="button" id="sethooking" value="start hooking" onclick="dohooking();"> 
<br /> 

<input type="button" id="hookee" value="press me"> 
<br /> 

</body> 
</html> 

Я могу видеть, как если бы я просто передать функцию как в:

bindEvent(btn, 'click', asyncMsg); 

, то она называется асинхронно, но тогда, как я прохожу 2 параметра?

ответ

2

Вы вызываете функцию немедленно, а не передаете функцию непосредственно функции bindEvent - потому что вызов функции происходит, когда вы используете оператор «()» для функции.

То, что вы хотите вместо того, чтобы это:

bindEvent(btn, 'click', asyncMsg.bind(null, toinsert, fldid)); 

bind() метод функции возвращает другие отзывной, который будет выполнять функцию с данным контекстом (null в данном случае) и предоставленные параметрами.

Другой вариант, который также работает в старых браузерах будут создавать анонимные функции, которая затем вызывает вашу функцию:

bindEvent(btn, 'click', function() { 
    asyncMsg(toinsert, fldid); 
}); 
+0

Примечание: при использовании привязки так, объект события будет передан на аргументы [2], вместо обычного первого аргумента. – bfavaretto

Смежные вопросы