【问题标题】:focusout only fires on document load and never again?focusout 仅在文档​​加载时触发,而不再触发?
【发布时间】:2015-01-26 18:40:25
【问题描述】:

我为你准备了一把小提琴:http://jsfiddle.net/pneebntd/3/

$(document).ready(function(){    
    $('#Address').focusout(ValidateAddress($(this).val(), "address"));
    $('#City').focusout(ValidateAddress($(this).val(), "city"));
    $('#State').focusout(ValidateAddress($(this).val(), "state"));
    $('#Zipcode').focusout(ValidateAddress($(this).val(), "zip/postal code"));
    $("#StateList").change(ValidateAddress($(this).val(), "state"));
});

function ValidateAddress(location, label) {
     console.info("made it there : " + location + " " + label);
}

简而言之,我正在(尝试)为我想要在控件失去焦点(或下拉列表更改值)时运行的函数附加事件处理程序。

按照它的编写方式,它会在页面加载时触发,但此后再也不会发生。我以前这样做过,但也许只是因为现在是星期一,但是……我在这里做错了什么?

【问题讨论】:

  • 阅读focusout的文档。
  • 我想知道为什么有人反对这个问题。它有一个运行示例,解释出了什么问题以及预期的行为是什么。仅仅因为这是一个愚蠢的错误,它并不构成一个坏问题。

标签: javascript jquery jquery-focusout


【解决方案1】:

这段代码

$('#Address').focusout(ValidateAddress($(this).val(), "address"));

调用 ValidateAddress 并将其返回值传递给focusout,与foo(bar()) 完全相同 调用 bar 并将其返回值传递给foo .

如果你想给focusout 一个函数,你必须这样做。例如:

$('#Address').focusout(function() {
    ValidateAddress($(this).val(), "address");
});

该代码创建一个新的匿名函数并将该函数引用传递给focusout。当事件发生时,它会调用你的ValidateAddress函数。

【讨论】:

  • 当你将不是函数的东西传递给事件处理程序设置函数时,jQuery 不应该抱怨吗?
  • 我发誓,有时候我什至不应该碰键盘。感谢您了解这一点。
  • @JuanMendes:检查可能不值得开销。例如,我的猜测是ValidateAddress 中根本没有return。所以称它为undefined。所以我们将undefined 传递给focusout。这很多就像在没有任何参数的情况下调用focusout,它应该触发事件。检查需要使用arguments 伪数组,如下所示:if (!handler && arguments.length > 0)。除了在这么大的库中它们不需要膨胀之外,在某些引擎上,在函数中使用arguments显着会减慢函数的速度。
  • 我想我没有想到不传递参数也是一个有效的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
相关资源
最近更新 更多