【问题标题】:Jquery Focus on input fieldJquery专注于输入字段
【发布时间】:2011-08-12 20:34:11
【问题描述】:

页面上的 HTML 有 20 个<input> 字段,每个字段都按从 1 到 20 的递增顺序命名并指定 ID。

如果变量id 设置为下一个连续的id (id + 1),此函数将导致焦点应用于该字段。但是,在当前输入框外点击时,如果输入的数字大于 10,则最后一个输入框不会重新获得焦点,但会显示警报。

$(":input").focusout(function(){
    var input = $(this).val();
    var id    = $(this).attr('id');
    if(input > 10){ 
        alert('You must enter a number between 0 and 10 '+id);
        $("#"+id).select();
    }
});

如何将最后一个输入字段设置为重新获得焦点?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    尝试替换:

    $("#"+id).select();
    

    与:

    $(this).focus();
    

    在这种情况下,$("#"+id)$(this) 是同一个元素,我假设您想在出现错误时使用 focus 元素。

    除此之外:我不相信 idname 值可以合法地以数字开头,您可能希望在它们前面加上 option1option2 等前缀。它可能有效,但是它还可能导致以后难以调试的问题。最好在谨慎和最佳实践方面犯错。

    What are valid values for the id attribute in HTML?

    编辑:在无法让focus() 工作后,我尝试使用setTimeout 并且能够实现它。我不确定为什么,或者这是否真的有必要,但它似乎有效。

    $(":input").focusout(function(){
        var $this = $(this),
            input = $this.val();
    
        if (input > 10){
            alert('You must enter a number between 0 and 10');
            setTimeout(function(){
            $this.focus();
            }, 1); 
        }
    }); 
    

    我很想听听是否有更好的方法或解释。我怀疑 blur 和 focus 事件的触发顺序没有使之前的方法成为可能?

    演示:http://jsfiddle.net/zRWV4/1/

    正如 cmets 中所述,您最终应该确保该值是具有 parseInt 或类似名称的整数(您似乎已经意识到这一点)。

    【讨论】:

    • 我试过这个。它似乎有同样的问题。不过干杯
    • 是的,由于某种原因(至少在 jsfiddle 上),我似乎无法让 focus() 在函数上下文之外工作。我希望你能找到解决方案,我无法解释。
    • 也感谢您提及最佳实践。它似乎没有让它工作,但再次感谢
    • 感谢它完美运行。您在此回复中付出了很多努力。我会接受这个答案。因为它确实解决了我的问题。但是像你一样,我很想知道是否有更好的方法来实现这一点。感谢所有帮助。
    • 当你应用setTimeout的延迟为0秒时,你可以确定你在delayed函数中的代码是在主处理完成后执行的。我猜问题中描述的行为发生是因为浏览器在 $this.focus() 运行后触发关注下一个元素。如果你实现了一个焦点事件,向 console.log 写入一些东西,你会看到当你离开一个无效字段时会触发两个焦点事件。
    【解决方案2】:

    替换

    $("#"+id).select();
    

    通过

    $("#"+id).focus();
    

    甚至通过

    $(this).focus();
    

    【讨论】:

    • 我试过这个。它似乎有同样的问题。不过干杯
    【解决方案3】:

    您应该解析输入中的文本以将其与数字进行比较。 var input = parseInt($(this).val()); '

       $(":input").blur(function(){
            var input = parseInt($(this).val());
            var id    = $(this).attr('id');
            if(input > 10){ 
                alert('You must enter a number between 0 and 10 '+id);
                $("#"+id).select();
            }
        });
    

    【讨论】:

    • 为建议喝彩。我试过你的版本没有用。我可能会实施 parseInt,但一旦我发现什么不允许焦点正确触发。谢谢
    【解决方案4】:

    (尝试使用.blur() 而不是.focusout()。但这可能无济于事)

    尝试暂时删除alert() - 它有时会导致焦点问题...

    【讨论】:

    • 它已经启动了,所以我认为这不是问题所在。我确实更改了脚本并尝试了这个。谢谢
    • @Max: ...我很害怕...所以尝试删除alert()一段时间-它有时会导致焦点问题...
    • 删除了警报,似乎没有任何区别。我可以点击另一个输入并输入。
    【解决方案5】:

    jsFiddle Example

    这是我的代码,我将解释我所做的更改:

    $('input[id^="input"]').focusout(function(){
        var selected = parseInt($(this).val(), 10);
        if (selected <= 10) {
            $("#input-"+selected).focus();
        }
        else {
            alert('Invalid Argument! 1-10 only!');
            $(this).focus();
        }
    });
    
    1. 我使用 focus() 而不是 select(),这不起作用。
    2. 您将idselect 混淆,导致您总是尝试选择$("#input-IDOFSELECTIONINPUT") 而不是$("#input-IDOFWANTEDINPUT")
    3. 在您的代码中,虽然会引发警报,但其余代码会正常继续。它不会出现在我的代码中。
    4. 您已将您想要的结果 ($("#"+id).select();) 置于不想要的条件 (input &gt; 10) 中,这实际上从未给它机会。
    5. 最后但并非最不重要的一点是,我为输入提供了一个更好(且有效)的 ID。 ID 不得以数字开头。

    【讨论】:

    • 这个演示似乎也遇到了同样的问题,它没有关注有错误的字段。
    • 对我有用。我最近更新了它,所以请务必观看更新版本 (/2/)。
    • 在 FF5 上仍然不适合我。铬没问题。使用 IE8 锁定在 alert() 对话框中。
    • @WesleyM 在 Chrome 上为我工作。让我试试FF5吧。
    • @WesleyM 好吧,我会...你是对的,它在 FF 上不起作用,多么奇怪的 xbrowser 不一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2012-05-19
    • 2017-10-13
    • 1970-01-01
    • 2021-10-24
    • 2019-01-21
    相关资源
    最近更新 更多