2013-03-17 64 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 2013-03-18 00:03:03