jQuery:如何查找不包含按钮的第一个可见输入/选择/文本区域?


87

我试过了

$(":input:not(input[type=button],input[type=submit],button):visible:first")

但找不到任何东西。

我怎么了

UPD:我在$(document).load()上执行此操作

<script type="text/javascript">
$(window).load(function () {
  var aspForm  = $("form#aspnetForm");
  var firstInput = $(":input:not(input[type=button],input[type=submit],button):visible:first", aspForm);
  firstInput.focus();
});
</script>

在调试中,我可以看到firstInput为空。

UPD2:我在Sharepoint下运行的ASP.NET页面中。

到目前为止,我发现对于某些元素,确实可以找到它们(对于固定的元素),对于某些则找不到。:(


尝试使用“输入”而不是“:输入”吗?
亚历克

应该工作正常。您的问题出在其他地方。你是不是在执行此之前$(document)ready()
BalusC,2010年

您有要搜索的特定html吗?
Shiki 2010年

也许第一个输入是type="hidden"?右键单击页面并查看源。生成的HTML也很重要。没有它和适当的SSCCE,它就会在黑暗中拍摄。
BalusC,2010年

Answers:


166

为什么不仅仅针对您想要的对象(演示)?

$('form').find('input[type=text],textarea,select').filter(':visible:first');

编辑

或使用jQuery :input选择器过滤表单后代。

$('form').find('*').filter(':input:visible:first');

5
复选框?无线电?密码?更不用说许多新的HTML5输入类型。
BalusC,2010年

9
@BalusC $('form')。find(':input')。filter(':visible:first')
Abe Petrillo

1
尽管在某种程度上可以正常工作,但它确实会忽略tabindex属性。
2013年

2
细小的nitpick但有用的补充:代替':visible:first',':visible:enabled:first'将是一个更好的过滤器,因为在某些情况下可以禁用top元素,并且焦点不能移到那里。
Prahlad Yeri

1
@PrahladYeri也许还排除了只读':input:visible:enabled:not([readonly]):first'
JustinStolle

13

jQuery代码很好。您必须在就绪处理程序中执行,而不是在窗口加载事件中执行。

<script type="text/javascript">
$(function(){
  var aspForm  = $("form#aspnetForm");
  var firstInput = $(":input:not(input[type=button],input[type=submit],button):visible:first", aspForm);
  firstInput.focus();
});
</script>

更新资料

我尝试了Karim79的示例(感谢示例),它可以正常工作:http : //jsfiddle.net/2sMfU/


3
谢谢@BalusC。我现在要去拍摄自己。我恨我自己。我本可以花最后一个小时不弄乱工作代码。我本可以喂狗,打扫厨房。我可以取得许多成就。现在我只有痛苦。再见,永远。。。是的,我应该听。
karim79 2010年

@karim:rofl。不用客气:)顺便说一句:我已经给孩子们洗澡了,把他们带到床上,喂饱了猫狗,给自己买了可口可乐;)
BalusC,2010年

7

这是我对上述内容的总结,非常适合我。谢谢(你的)信息!

<script language='javascript' type='text/javascript'>
    $(document).ready(function () {
        var firstInput = $('form').find('input[type=text],input[type=password],input[type=radio],input[type=checkbox],textarea,select').filter(':visible:first');
        if (firstInput != null) {
            firstInput.focus();
        }
    });
</script>

3

这是对@Mottie答案的改进,因为从jQuery 1.5.2开始,:text选择的input元素没有指定的type属性(在这种情况下type="text"是隐含的):

$('form').find(':text,textarea,select').filter(':visible:first')

1

这是我的解决方案。该代码应该足够容易理解,但是这里是这样的想法:

  • 获取所有输入,选择和文本区域
  • 过滤掉所有按钮和隐藏字段
  • 过滤到仅启用的可见字段
  • 选择第一个
  • 聚焦选定的领域

编码:

function focusFirst(parent) {
    $(parent).find('input, textarea, select')
        .not('input[type=hidden],input[type=button],input[type=submit],input[type=reset],input[type=image],button')
        .filter(':enabled:visible:first')
        .focus();
}

然后只需使用父元素或选择器调用focusFirst。

选择器:

focusFirst('form#aspnetForm');

元件:

var el = $('form#aspnetForm');
focusFirst(el);

0

您可以尝试以下代码...

$(document).ready(function(){
    $('form').find('input[type=text],textarea,select').filter(':visible:first').focus();
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<form>
<input type="text" />
<input type="text" />
<input type="text" />
<input type="text" />
<input type="text" />
    
<input type="submit" />
</form>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.