0

所以,我在这里有一个工作版本:http: //jsfiddle.net/yEmvm/19/

当您单击第一个地址块的公司,然后单击名称时,它会触发事件并显示无效地址。在我为第二个地址块或第一个地址块之外的任何地方找到公司之前,我不想触发该事件。我想不出另一个事件来触发它。

这只是一个例子。此页面将包含未知数量的地址块,从 3 到 99。此外,它将包含更多字段用于完整地址。用户可以通过按钮继续添加更多内容。但是,class 和 id 的名称结构是一致的。

4

2 回答 2

4

您应该在超时时运行您的代码,并在焦点上取消计时器:

$('.address').each(function()
{
    var timer;

    $(this).find('input').blur(function()
    {
        timer = setTimeout(function()
        {
            var verified = false; // run your verification here

            if ( ! verified )
            {                
                // run code here to display error
            }
        }, 0);
    })
    .focus(function()
    {
        timer && clearTimeout(timer);
    });
});​

这是一个非常基本的示例:http: //jsfiddle.net/U6TRj/3/


解释:

基本上,如果您在input关注另一个元素的同时单击一个元素input,浏览器将首先触发blur旧元素上的focus事件,然后触发新元素上的事件。

我们在这里所做的timeout(不需要延迟)是将代码的执行推入堆栈,以便它在focus事件处理程序之后执行。这样,我们可以从focus回调中取消它的执行。

于 2012-07-17T20:23:14.720 回答
1

这是 .focusout() http://api.jquery.com/focusout/#dsq-comment-108827731的 jQuery API 文档中记录的行为

也许那里建议的插件可以帮助您解决问题:http: //archive.plugins.jquery.com/project/focus

于 2012-07-17T20:34:58.703 回答