2013-03-17 60 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