jQuery: làm thế nào để tìm thấy các nút đầu vào / select / textarea có thể nhìn thấy đầu tiên?


87

Tôi đã thử

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

nhưng nó không tìm thấy gì cả.

Lỗi của tôi là gì?

UPD: Tôi thực hiện điều này trên $ (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>

và trong phần gỡ lỗi, tôi có thể thấy rằng firstInput trống.

UPD2: Tôi đang ở trang ASP.NET chạy dưới Sharepoint.

Tôi đã tìm thấy cho đến nay rằng đối với một số phần tử, nó tìm thấy chúng (đối với những phần tử cố định) và đối với một số thì không. :(


Hãy thử "input" thay vì ": input"?
Alec

Nên hoạt động tốt. Vấn đề của bạn nằm ở một nơi khác. Bạn không thực hiện này trước sự $(document)ready()?
BalusC

Bạn có một html cụ thể để tìm kiếm không?
Shiki

Có thể đầu vào đầu tiên là của type="hidden"? Nhấp chuột phải vào trang và xem nguồn. HTML được tạo cũng quan trọng. Nếu không có nó và một SSCCE thích hợp , nó sẽ quay trong bóng tối.
BalusC

Câu trả lời:


166

Tại sao không chỉ nhắm mục tiêu những cái bạn muốn ( demo )?

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

Biên tập

Hoặc sử dụng jQuery : input selector để lọc các mẫu con.

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

5
Hộp kiểm? Đài? Mật khẩu? Chưa kể đến rất nhiều kiểu nhập HTML5 mới.
BalusC

9
@BalusC $ ('form'). Find (': input'). Filter (': display: first')
Abe Petrillo

1
Mặc dù điều này hoạt động ở một mức độ nào đó, nhưng nó không bỏ qua thuộc tính tabindex.
eoleary

2
Nitpick nhỏ nhưng bổ sung hữu ích: thay vì ': hiển thị: đầu tiên', ': hiển thị: đã kích hoạt: đầu tiên' sẽ là một bộ lọc tốt hơn nhiều vì phần tử trên cùng có thể bị vô hiệu hóa trong một số trường hợp và tiêu điểm không thể dịch chuyển ở đó.
Prahlad Yeri

1
@PrahladYeri Có lẽ cũng loại trừ chỉ đọc':input:visible:enabled:not([readonly]):first'
JustinStolle

13

Mã JQuery là tốt. Bạn phải thực thi trong trình xử lý sẵn sàng không có trong sự kiện tải cửa sổ.

<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>

Cập nhật

Tôi đã thử với ví dụ của Karim79 (cảm ơn ví dụ) và nó hoạt động tốt: http://jsfiddle.net/2sMfU/


3
Cảm ơn @BalusC. Tôi sẽ tự bắn mình bây giờ. Tôi ghét chính bản thân mình. Tôi có thể đã dành một giờ cuối cùng để không làm việc với mã. Lẽ ra tôi có thể cho chó ăn, dọn bếp. Có rất nhiều điều tôi có thể đã đạt được. Bây giờ tất cả những gì tôi có là đau đớn. Tạm biệt, mãi mãi .... Và vâng, lẽ ra tôi nên lắng nghe.
karim79

@karim: rofl. Bạn được chào đón :) Btw: Tôi đã tắm cho con tôi, mang chúng lên giường, cho chó và mèo ăn và tự uống coca cola;)
BalusC

7

Đây là bản tóm tắt của tôi về những điều trên và hoạt động hoàn hảo đối với tôi. Cảm ơn bạn về thông tin!

<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

Đây là một cải tiến so với câu trả lời của @ Mottie vì jQuery 1.5.2 :textchọn inputcác phần tử không có typethuộc tính được chỉ định (trong trường hợp đó type="text"là ngụ ý):

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

1

Đây là giải pháp của tôi. Mã phải đủ dễ để làm theo nhưng đây là ý tưởng:

  • nhận tất cả đầu vào, lựa chọn và văn bản
  • lọc ra tất cả các nút và các trường ẩn
  • lọc để chỉ các trường được bật, hiển thị
  • chọn cái đầu tiên
  • tập trung vào trường đã chọn

Mật mã:

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();
}

Sau đó, chỉ cần gọi focusFirst bằng phần tử mẹ hoặc bộ chọn của bạn.

Bộ chọn:

focusFirst('form#aspnetForm');

Thành phần:

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

0

Bạn có thể thử mã bên dưới ...

$(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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.