与jQuery的简单绑定

时间:2012-09-30 01:03:57

标签: jquery

我正在尝试重新使用jQuery,并且很难开始使用。

在下面的代码中,我试图说“当DOM准备就绪时,将警报绑定到'choice'div的更改事件,这实际上是表单上的select元素。当我重新加载表单时,通过警报立即显示,并且在我进行新选择时不显示。

以下是代码:

$(document).ready(doBind());

function doBind() {
    $('#choice').change(myAlert('Choice has been changed!'));    
}

function myAlert($msg) {
    alert($msg);
}

4 个答案:

答案 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!')});
}
  1. 将函数作为对象传递。 ()执行该函数,将该函数视为对象。当指示回调时,您将该函数作为对象传递(除非您正在执行的函数返回一个函数对象,这称为currying)。

  2. $.on是在最新的jquery中绑定事件的首选方法。您可以找到它的文档here

  3. 通常创建这样的函数:var doBind = function() { //doBind stuff }这有助于识别您将函数作为对象传递,并且还可以防止它们使全局命名空间混乱。

  4. 希望这会有所帮助:)

答案 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);