1

我正在尝试让自己重新熟悉 jQuery,但开始时遇到了困难。

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

这是代码:

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

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

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

4 回答 4

4

您需要区分函数引用和调用(调用)。当您关联事件处理程序或回调时,您需要一个函数引用,然后在适当的时间调用该函数引用。一旦您传递参数并将(..)(或 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(..)但关注引用与调用是您问题的主要问题。

于 2012-09-30T01:32:41.477 回答
2

功能我的警报必须是这样的:

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

这是因为您需要将函数传递给change. 当您这样做myAlert('Choice has been changed!')时,您传递的不是函数myAlert,而是执行后的结果。

于 2012-09-30T01:06:00.427 回答
2
$(document).ready(doBind);

function doBind() {
    $('#choice').on('change', function(){alert('Choice has been changed!')});
}
  1. 将函数作为对象传递。() 执行该函数,而将其关闭则将其视为一个对象。当指示回调时,您将函数作为对象传递(除非您正在执行的函数返回一个函数对象,这称为柯里化)。

  2. $.on是在最新的 jquery 中绑定事件的首选方式。你可以在这里找到它的文档。

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

希望这可以帮助 :)

于 2012-09-30T01:30:46.100 回答
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);
于 2012-09-30T02:21:07.090 回答