我知道这有效:
$("#btn_1").click(function() {
alert("Btn 1 Clicked");
});
虽然这只会过早地弹出警告对话框:
$("#btn_1").click(alert("Btn 1 Clicked"););
我的问题是:在第二种情况下,为什么警报在执行之前不会等待 点击 ?
答案 0 :(得分:2)
因为当你调用一个函数时,会立即执行参数以提供传递给函数的参数。
func(arg);
相当于:
var temp = arg;
func(temp);
所以当你写:
$("#btn_1").click(alert("Btn 1 Clicked"));
它相当于:
var temp = alert("Btn 1 Clicked");
$("#btn_1").click(temp);
很明显,在这种形式中,警告发生在调用.click()
之前为事件添加侦听器。
为了延迟动作,你必须提供一个函数作为参数。函数定义本身并不会导致任何代码被执行,它只会在以后调用时执行(这称为"回调")。
它不必是匿名函数,您也可以将其命名。
function myAlert() {
alert("Btn 1 Clicked");
}
$("#btn_1").click(myAlert);
但请注意,您只是提供函数的名称作为.click()
的参数,您不要写myAlert()
,因为这会立即调用它,而不会延迟到点击事件发生。
正如@Titus所说,click()
期望它的参数是一个函数,因为它想要将它作为回调来执行。但是你可以调用另一个函数来返回一个函数:
function alerter(message) {
return function() {
alert(message);
}
}
$("#btn_1").click(alerter("Btn 1 Clicked"));
请注意,alerter()
没有直接调用alert()
,它会返回另一个函数,该函数在调用时会调用alert()
。如上所述,在click事件执行其回调之前不会发生这种情况。
答案 1 :(得分:2)
这是我能想到的最佳解释:
issues
答案 2 :(得分:1)
addAction(okAction)
函数需要一个函数作为参数,你不会将它作为函数传递,你将它传递给函数的结果。
考虑一下:click(...)
func(1+2)
方法的参数将是func
(结果)而不是3
(操作本身)。
答案 3 :(得分:1)
我的问题是:在第二种情况下,为什么警报不等待点击 在执行之前?
您正在调用该函数。
您可以使用event
.bind()
发生时要调用的函数
$("#btn_1").click(alert.bind(window, "Btn 1 clicked"));