完成以下任务的正确方法是什么:
$("#btn").click(function1);
调用函数:
function function1 (event) {
event.preventDefault();
}
这似乎可行,但是我不明白 function1 如何在没有传入事件参数的情况下理解它所指的内容。这样设置的侦听器是否更有意义:
$("#btn").click(function1(event));
这是一个小提琴。
完成以下任务的正确方法是什么:
$("#btn").click(function1);
调用函数:
function function1 (event) {
event.preventDefault();
}
这似乎可行,但是我不明白 function1 如何在没有传入事件参数的情况下理解它所指的内容。这样设置的侦听器是否更有意义:
$("#btn").click(function1(event));
这是一个小提琴。
jQuery 中的.click()
函数,除了作为第一个参数的函数。在 Javascript 中,函数是值,以及原始值或对象。函数是一等公民。
如果function1(event)
作为参数使用,函数会被执行,因为这是函数名后面括号的语义。所以.click()
jQuery 函数会收到函数的输出,这不是预期的类型。
将函数名作为参数传递意味着您传递的是函数(实际上是对函数的引用),而不是函数调用的结果。当点击事件被触发时,该函数将被调用。这种情况下的函数称为“回调”。
回调在 Javascript 中非常重要,因为事件驱动的行为是使用客户端脚本的主要原因。
回调系统背后的概念是
//the click function
function doSomething(callback){
//in your case the event is the argument that jQuery will prepare for you
var argument = produceTheArgument();
//doSomething is in charge to invoke the function, passing the argument
callback(argument);
}
//your function
function myCallback(argument){
//your function will consume the argument
}
//my callback is passed as a reference, not invoked
doSomething(myCallback);
在您的第一个示例function1
中,知道event
变量是,因为 JavaScript(以及随后的 jQuery)将事件信息作为参数传递。
这是 JavaScript 的本质,而不仅仅是 jQuery。考虑以下:
document.getElementById('btn').addEventListener('click', function1, false);
function function1(e)
{
console.log(e);
}
JavaScript会在被点击function1
时自动调用#btn
,它会自动添加事件信息作为第一个参数。jQuery 也简单地将这些信息传递给它自己的方法,以便您可以访问它。
您正在订阅事件并在点击侦听器中传递对函数的引用 - jQuery 事件处理器只会在 jQuery 的上下文中调用您的函数并将所有参数传递给它。
根据 jQuery 的文档:
当鼠标指针悬停在元素上时,click 事件被发送到元素,并且鼠标按钮被按下和释放。任何 HTML 元素都可以接收此事件。