我正在尝试重新使用jQuery,并且很难开始使用。
在下面的代码中,我试图说“当DOM准备就绪时,将警报绑定到'choice'div的更改事件,这实际上是表单上的select元素。当我重新加载表单时,通过警报立即显示,并且在我进行新选择时不显示。
以下是代码:
$(document).ready(doBind());
function doBind() {
$('#choice').change(myAlert('Choice has been changed!'));
}
function myAlert($msg) {
alert($msg);
}
答案 0 :(得分:4)
您需要区分函数引用和调用(调用)。当您关联事件处理程序或回调时,您需要一个函数 reference ,然后在适当的时候调用它。一旦传递参数并将(..)
(或一个nullary ()
)添加到函数引用中,就会调用 。如果在绑定期间执行此操作,则将在绑定时调用该函数,并且将绑定函数的输出而不是绑定引用(这将允许通常预期的,稍后调用)。
您应该按如下方式更改两个绑定:
$(document).ready(doBind); //Now a reference to that function
function doBind() {
$('#choice').change(function() { myAlert('Choice has been changed!');});
//New anonymous function reference which allows for arguments and is conventionally used
}
function myAlert($msg) {
alert($msg);
}
一些简单的示例,突出显示语法和()
的使用方法的差异。
以下功能将采用功能参考。作为参数然后在内部执行它(基本上是处理程序和回调如何工作)。
functionWrapper = function(funk) {
//Do something else
funk()
}
现在流行的匿名函数声明后跟立即调用:函数通常会写成function() {...}()
,这会导致使用提供的任何参数立即调用对新创建的函数的引用(在JavaScript中用于强制执行作用域)。然后,在任一情况下的参数都可以作为函数中的参数使用,因此调用(..)
中的任何内容都映射到function(..)
中声明的内容,但是关注引用与调用是您的主要问题。问题
答案 1 :(得分:2)
功能我的警报必须是这样的:
function myAlert($msg) {
return function() {
alert($msg);
}
}
这是因为您需要将函数传递给change
。执行myAlert('Choice has been changed!')
时,传递的内容不是函数myAlert
,而是执行后的结果。
答案 2 :(得分:2)
$(document).ready(doBind);
function doBind() {
$('#choice').on('change', function(){alert('Choice has been changed!')});
}
将函数作为对象传递。 ()执行该函数,将该函数视为对象。当指示回调时,您将该函数作为对象传递(除非您正在执行的函数返回一个函数对象,这称为currying)。
$.on
是在最新的jquery中绑定事件的首选方法。您可以找到它的文档here。
通常创建这样的函数:var doBind = function() { //doBind stuff }
这有助于识别您将函数作为对象传递,并且还可以防止它们使全局命名空间混乱。
希望这会有所帮助:)
答案 3 :(得分:1)
到目前为止给出的所有答案都非常好。但是,他们没有提到的是,这并不是人们通常编写jQuery代码的方式。通常,在加载文档时,您要初始化许多内容。因此实际上总是编写事物的方式是使用匿名函数,其主体是所有局部变量,函数和初始化。因此,您可以编写:
而不是单独的doBind()函数$(document).ready(function () {
$('#choice').change(myAlert);
function myAlert($msg) {
alert($msg);
}
});
由于这是如此常见,jQuery为它提供了一个简写符号:
$(function () {
$('#choice').change(myAlert);
function myAlert($msg) {
alert($msg);
}
});
如果你想坚持使用单独的命名函数,你可以写:
$(doBind);