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: я нахожусь на странице ASP.NET, работающей под Sharepoint.

Я обнаружил, что для некоторых элементов он их находит (для фиксированных), а для некоторых нет. :(

Артем
источник
Попробуйте "input" вместо ": input"?
Алек
Должно работать нормально. Ваша проблема в другом. Вы не выполняет это , прежде$(document) это ready()?
BalusC
У вас есть определенный HTML-код для поиска?
Шики
Может первый вход есть оф type="hidden"? Щелкните страницу правой кнопкой мыши и просмотрите исходный код. Сгенерированный HTML также имеет значение. Без него и надлежащего SSCCE он снимает в темноте.
BalusC

Ответы:

166

Почему бы просто не выбрать те, которые вам нужны ( демо )?

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

редактировать

Или используйте jQuery : селектор ввода для фильтрации потомков формы.

$('form').find('*').filter(':input:visible:first');
Мотти
источник
5
Флажок? Радио? Пароль? Не говоря уже о множестве новых типов ввода HTML5.
BalusC
9
@BalusC $ ('form'). Find (': input'). Filter (': visible: first')
Эйб Петрилло
1
Хотя это до некоторой степени работает, он игнорирует атрибут tabindex.
eoleary
2
Небольшая придирка, но полезное дополнение: вместо ': visible: first', ': visible: enabled: first' будет гораздо лучший фильтр, потому что в некоторых случаях верхний элемент может быть отключен, и фокус не может там сместиться.
Прахлад Йери,
1
@PrahladYeri Возможно также исключить только для ':input:visible:enabled:not([readonly]):first'
чтения
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
@karim: рофл. Пожалуйста :) Кстати: Я уже купал своих детей, приносил их в постель, кормил собак и кошек и принимал кока-колу;)
BalusC
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>

Махбуб
источник