Cách đặt tiêu điểm thành đầu vào văn bản đầu tiên trong phương thức bootstrap sau khi được hiển thị


116

Tôi tải một phương thức bootstrap động và nó chứa ít đầu vào văn bản. Vấn đề tôi gặp phải là tôi muốn con trỏ tập trung vào đầu vào đầu tiên trong phương thức này và điều này không xảy ra theo mặc định.
Vì vậy, tôi đã viết mã này để làm điều đó:

$('#modalContainer').on('show', function () {
   $('input:text:visible:first').focus();
});

Nhưng bây giờ nó tập trung vào đầu vào trong giây lát rồi tự động biến mất, tại sao điều này lại xảy ra và cách giải quyết?


2
Bạn có thể cung cấp bản demo trên jsfiddle.net không?
không xác định

Hãy thử đặt thời gian chờ cho nó, một cái gì đó khác có thể đang can thiệp. setTimeout(function() { /* Your code */ }, 100);
qwerty

bạn có thể thử cái này cho tôi ... var index = 0; $ ('# modalContainer'). on ('show', function () {index = 1;}); if (index) {$ ('input: text: display: first'). focus (); }
chirag ghiyad

Câu trả lời:


187

@scumah có câu trả lời cho bạn: Twitter bootstrap - Tập trung vào textarea bên trong một phương thức khi nhấp

Đối với Bootstrap 2

modal.$el.on('shown', function () {
$('input:text:visible:first', this).focus();
});  

Cập nhật: Đối với Bootstrap 3

$('#myModal').on('shown.bs.modal', function () {
    $('#textareaID').focus();
})  

========== Cập nhật ======

Để trả lời câu hỏi, bạn có thể sử dụng điều này với nhiều phương thức trên cùng một trang nếu bạn chỉ định các mục tiêu dữ liệu khác nhau, đổi tên các ID phương thức để phù hợp và cập nhật ID của các trường nhập biểu mẫu và cuối cùng cập nhật JS của bạn để phù hợp với những ID:
xem http://jsfiddle.net/panchroma/owtqhpzr/5/

HTML

...
<button ... data-target="#myModal1"> ... </button> 
... 
<!-- Modal 1 -->
<div class="modal fade" id="myModal1" ...>
... 

<div class="modal-body"> <textarea id="textareaID1" ...></textarea></div>

JS

$('#myModal1').on('shown.bs.modal', function() {
  $('#textareaID1').focus();
})

điều này chỉ hoạt động nếu có một phương thức trên trang? nếu nhiều hơn một cái thì sao?
Ramesh Pareek

tuyệt vời, phản hồi nhanh chóng! Tôi đã mắc một lỗi ngớ ngẩn, hoạt động ngay!
Ramesh Pareek,

+1 Thay đổi mã của tôi từ "hiển thị" thành "được hiển thị" khi tôi đọc được câu trả lời của bạn sau gần một giờ cố gắng làm cho mã này hoạt động.
Exel Gamboa

Điều này gây ra lỗi callstack tối đa khi xác thực jquery kích hoạt !. Do đó, điều này không có ích gì cho tôi.
Vandita

@Vandita, nếu bạn muốn bắt đầu một cây bút trên codepen.io minh họa vấn đề bạn mô tả, tôi rất vui được xem nó cho bạn.
David Taiaroa

80

Tôi đã tìm thấy cách tốt nhất để làm điều này mà không cần jQuery.

<input value="" autofocus>

hoạt động hoàn hảo.

Đây là một thuộc tính html5. Được hỗ trợ bởi tất cả các trình duyệt chính.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input


Sau khi trải qua một vài giờ cố gắng để có được công việc này như thế nào nên (nhấp chuột hoặc trên bộ xử lý) tôi thấy chỉ có một phương pháp mà các công trình đó là thuộc tính html5 tự động lấy nét:<input type="text" class="form-control" placeholder="" autofocus>
lots0logs

1
Đây là cách bạn có thể làm điều đó trên điều khiển MVC3: @Html.TextBoxFor(m => m.UserName, new { @autofocus="" })
Flea

19
Nó đã không có tác dụng đối với tôi ... sau khi thấy bootstrap phương thức đầu vào mất tập trung
Diego Cotini

Tôi cũng thấy tiêu điểm tăng đầu vào trong giây lát sau khi phương thức bootstrap xuất hiện khi sử dụng lấy nét tự động. Tuy nhiên, đầu vào sau đó mất tiêu điểm. Phải triển khai trình xử lý .on ().
raddevus

7
Điều này hoạt động nếu bạn xóa tabdindex="-1"khỏi phương thức của mình, tuy nhiên nó chỉ hoạt động một lần. Đóng và mở lại không tập trung.
Memet Olsen

42

Câu trả lời của David Taiaroa là đúng, nhưng không hiệu quả vì thời gian để "mờ dần" phương thức không cho phép bạn tập trung vào đầu vào. Bạn cần tạo độ trễ:

$('#myModal').on('shown.bs.modal', function () {
    ...
    setTimeout(function (){
        $('#textareaID').focus();
    }, 1000);

})

2
Bạn là quyền duy nhất ở đây. Giải pháp của bạn là giải pháp duy nhất hoạt động. Tôi đã cố gắng đặt giá trị nhỏ hơn cho timeOut nhưng không hoạt động. Có vẻ như phương thức "kết thúc tải" ở 1000ms :(
Enrique

1
yeah, nhưng ngày nay, trong dự án mới của tôi, tôi đã sử dụng <input value="" autofocus>và làm việc tốt cho tôi thời gian này, lạ
Marcos Furquim

3
Cách chính xác là sử dụng sự kiện show.bs.modal
Akhorus,

2
Thay vì sử dụng setTimeout (), bạn có thể sử dụng delay () như sau ... $ ('# textareaID'). Delay (1000) .focus (). Select ();
Tony

Chắc chắn là giải pháp hiệu chỉnh.
Frank Thomas

18

Mã thông thường (bên dưới) không hoạt động đối với tôi:

$('#myModal').on('shown.bs.modal', function () {
  $('#myInput').focus()
})

Tôi đã tìm thấy giải pháp :

$('body').on('shown.bs.modal', '#myModal', function () {
    $('input:visible:enabled:first', this).focus();
})

xem thêm tại đây


9

Tôi nhận được rằng bootstrap đã thêm thông tin sau trên trang của họ:

Do cách HTML5 xác định ngữ nghĩa của nó, thuộc tính HTML tự động lấy nét không có tác dụng trong các phương thức Bootstrap. Để đạt được hiệu quả tương tự, hãy sử dụng một số JavaScript tùy chỉnh:

$('#myModal').on('shown.bs.modal', function () {
  $('#myInput').focus()
})

http://getbootstrap.com/javascript/#modals


7

Đây là mã đơn giản sẽ phù hợp nhất với bạn trên tất cả các cửa sổ bật lên có bất kỳ trường đầu vào nào với việc lấy nét nó

$(".modal").on('shown.bs.modal', function () {
    $(this).find("input:visible:first").focus();
});

4

Tôi nghĩ câu trả lời đúng nhất, giả sử việc sử dụng jQuery, là sự hợp nhất các khía cạnh của tất cả các câu trả lời trong trang này, cộng với việc sử dụng sự kiện mà Bootstrap vượt qua:

$(document).on('shown.bs.modal', function(e) {
  $('input:visible:enabled:first', e.target).focus();
});

Nó cũng sẽ làm việc thay đổi $(document)để $('.modal')hoặc để thêm một lớp học để các phương thức mà các tín hiệu mà tập trung này nên xảy ra, giống như$('.modal.focus-on-first-input')


2
Đây là giải pháp tốt nhất, chung nhất mà tôi đã thấy ở đây :)
Martin T.

Nếu bạn cũng muốn nó bỏ qua các hộp văn bản chỉ đọc, hãy sửa đổi dòng để đọc: $ ('input: display: enable: not ([readonly]): first', e.target) .focus ();
Douglas Timms

3

hãy thử mã này, nó có thể phù hợp với bạn

$(this).find('input:text')[0].focus();

1
Đây là những gì tôi sử dụng:$(this).find('input:text').first().focus()
Jimmy

1

Bước đầu tiên, bạn phải đặt autofocusthuộc tính của mình khi nhập biểu mẫu.

<input name="full_name" autofocus/>

Và sau đó bạn phải thêm khai báo để đặt tự động lấy nét cho đầu vào của bạn sau khi phương thức của bạn được hiển thị.
Hãy thử mã này:

$(document).on('ready', function(){
    // Set modal form input to autofocus when autofocus attribute is set
    $('.modal').on('shown.bs.modal', function () {
        $(this).find($.attr('autofocus')).focus();
    });
});

tôi đã sử dụng $ (this) .find ('[autofocus]'). focus (); và nó hoạt động
SummerRain

0

Nếu bạn muốn chỉ tự động lấy tiêu điểm bất kỳ phương thức nào đã được mở, bạn có thể đưa vào các mẫu hoặc hàm lib đoạn mã này sẽ tập trung vào đầu vào đầu tiên:

$('.modal').on('shown.bs.modal', function () {
  $(this).find('input:first').focus();
})

0

nếu bạn đang tìm kiếm một đoạn mã sẽ hoạt động cho tất cả các phương thức của mình và tự động tìm kiếm văn bản đầu vào đầu tiên trong văn bản đã mở, bạn nên sử dụng điều này:

$('.modal').on('shown.bs.modal', function () {
    $(this).find( 'input:visible:first').focus();
});

Nếu phương thức của bạn được tải bằng ajax, hãy sử dụng phương thức này để thay thế:

$(document).on('shown.bs.modal', '.modal', function() {
    $(this).find('input:visible:first').focus();
});

0

đây là giải pháp chung nhất

$('body').on('shown.bs.modal', '.modal', function () {
    $(this).find(":input:not(:button):visible:enabled:not([readonly]):first").focus();
});
  • hoạt động với các phương thức được thêm vào DOM sau khi tải trang
  • hoạt động với đầu vào, vùng văn bản, chọn và không với nút
  • ommits ẩn, vô hiệu hóa, chỉ đọc
  • hoạt động với các phương thức mờ dần, không cần setInterval

0

Cố gắng loại bỏ thuộc tính tabIndex của phương thức , khi đầu vào / hộp văn bản của bạn đang mở. Đặt nó trở lại như trước đây , khi bạn đóng input / textbox. Điều này sẽ giải quyết vấn đề không phân biệt phiên bản bootstrapkhông ảnh hưởng đến luồng trải nghiệm người dùng .


0

Theo Bootstrap 4 docs:

Do cách HTML5 xác định ngữ nghĩa của nó, thuộc tính HTML tự động lấy nét không có tác dụng trong các phương thức Bootstrap. Để đạt được hiệu quả tương tự, hãy sử dụng một số JavaScript tùy chỉnh.

Ví dụ:

$('#idOfMyModal').on('shown.bs.modal', function () {
    $('input:first').trigger('focus')
});

Liên kết .


0

Sử dụng tính năng tự động lấy nét để tìm kiếm phần tử biểu mẫu phù hợp:

$('.modal').on('shown.bs.modal', function() {
  $(this).find('[autofocus]').focus();
});

-1
$(document).ready(function() {
  $("#button").click(function() {
    $('#mymodal').on('shown.bs.modal', function() {
      $('#myinput').focus();
    })
  });
});
  • Nó là "#button" gọi biểu mẫu phương thức,

  • "#mymodal" là dạng phương thức,

  • "#myinput" là đầu vào bạn muốn lấy tiêu điểm

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.