Cách đặt tiêu điểm cho một trường cụ thể trong phương thức Bootstrap, khi nó xuất hiện


182

Tôi đã thấy một vài câu hỏi liên quan đến các chế độ bootstrap, nhưng không có câu hỏi nào chính xác như thế này, vì vậy tôi sẽ tiếp tục.

Tôi có một phương thức mà tôi gọi là onclick như vậy ...

$(".modal-link").click(function(event){
  $("#modal-content").modal('show');
});

Điều này hoạt động tốt, nhưng khi tôi hiển thị phương thức tôi muốn tập trung vào phần tử đầu vào đầu tiên ... Trong trường hợp có thể phần tử đầu vào đầu tiên có id là #photo_name.

Vì vậy, tôi đã cố gắng

   $(".modal-link").click(function(event){
     $("#modal-content").modal('show');
     $("input#photo_name").focus();
   });

Nhưng điều này là vô ích. Cuối cùng, tôi đã cố gắng ràng buộc với sự kiện 'chương trình' nhưng ngay cả như vậy, đầu vào sẽ không tập trung. Cuối cùng chỉ để thử nghiệm, vì tôi đã nghi ngờ đây là về thứ tự tải js, tôi đặt vào setTimeout chỉ để xem nếu tôi trì hoãn một giây, liệu tiêu điểm có hoạt động không, và vâng, nó hoạt động! Nhưng phương pháp này rõ ràng là tào lao. Có cách nào để có hiệu ứng tương tự như dưới đây mà không cần sử dụng setTimeout không?

  $("#modal-content").on('show', function(event){
    window.setTimeout(function(){
      $(event.currentTarget).find('input#photo_name').first().focus()
    }, 0500);
  });

Câu trả lời:


371

Thử cái này

Đây là DEMO cũ :

EDIT: (Đây là một DEMO đang hoạt động với Bootstrap 3 và jQuery 1.8.3)

$(document).ready(function() {
    $('#modal-content').modal('show');
    $('#modal-content').on('shown', function() {
        $("#txtname").focus();
    })
});

Bắt đầu bootstrap 3 cần sử dụng sự kiện shows.bs.modal:

$('#modal-content').on('shown.bs.modal', function() {
    $("#txtname").focus();
})

3
Cảm ơn bạn. Tôi đã không thấy sự kiện "hiển thị". Chính xác những gì tôi đang tìm kiếm.
jdkealy

cảm ơn! bản demo không hoạt động nữa nhưng đoạn trích thì có.
Kreker

@keyur tại codebins.com Sự kiện này bắt đầu sau khi phương thức được hiển thị, nếu tôi phải bắt đầu sự kiện trước khi phương thức được hiển thị
Thomas Shelby

okej, tôi nên sử dụng 'show.bs.modal' thay vì 'shows.bs.modal'
Thomas Shelby

về trình xử lý tiêu điểm, nó đòi hỏi một chút độ trễ, do đó bạn phải nhưng nó trong một công cụ setInterval như thế này: setInterval (function () {$ ("# your-input"). Focus ();}, 50);
Nguyễn Minh Hiển

76

Chỉ muốn nói rằng Bootstrap 3 xử lý việc này hơi khác một chút. Tên sự kiện là "shows.bs.modal".

$('#themodal').on('shown.bs.modal', function () {
   $("#txtname").focus();
});

hoặc tập trung vào đầu vào có thể nhìn thấy đầu tiên như thế này:

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

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


Nó hoạt động với tôi nếu tôi sử dụng .on ('show.bs.modal') không được hiển thị
Peter Graham

Phải mất rất nhiều thời gian trong khi tôi thấy nó nên là "show.bs ..." thay vì "show.bs ...". Hiển thị không làm việc cho tôi. Thật ra cả hai đều đang làm việc và họ là những sự kiện khác nhau. Xin lỗi bỏ qua câu đầu tiên của tôi.
Vladyn

@PeterGraham có lẽ bạn đang sử dụng bootstrap 2?
FindOutIslamNow

10

Tôi đang sử dụng điều này trong bố cục của mình để nắm bắt tất cả các phương thức và tập trung vào đầu vào đầu tiên

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

Ngọt. Phần tử đầu vào đầu tiên của tôi bị ẩn, vì vậy tôi nghĩ rằng tôi sẽ phải làm: $ (this) .find ('input: not ([type = hidden])'). Focus ();
jdkealy

2
Hoặc$(this).find('input:visible').focus();
Stephan Muller

2
nên là $ (this) .find ('input'). first (). Focus () nếu bạn không muốn tập trung tất cả các đầu vào
Jacek Pietal

9

Tôi gặp vấn đề tương tự với bootstrap 3, tập trung khi tôi nhấp vào liên kết, nhưng không phải khi kích hoạt sự kiện bằng javascript. Giải pháp:

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

Có lẽ nó là một cái gì đó về hoạt hình!


Chắc chắn có một cái gì đó đang xảy ra với hình ảnh hoạt hình. Ngay cả khi tôi tắt chế độ mờ dần trong các tùy chọn, nó sẽ không hiển thị nếu có nhiệm vụ chuyên sâu về CPU ngay sau khi bật chế độ. Sử dụng thời gian chờ này là cách duy nhất tôi có thể làm cho nó hoạt động.
krx

8

Tôi gặp vấn đề khi bắt sự kiện "shows.bs.modal" .. Và đây là giải pháp của tôi hoạt động hoàn hảo ..

Thay vào đó đơn giản trên ():

$('#modal').on 'shown.bs.modal', ->

Sử dụng trên () với phần tử được ủy quyền:

$('body').on 'shown.bs.modal', '#modal', ->

6

Có vẻ là do hoạt hình phương thức được bật ( fadetrong lớp của hộp thoại), sau khi gọi.modal('show') , hộp thoại không hiển thị ngay lập tức, vì vậy nó không thể lấy nét vào lúc này.

Tôi có thể nghĩ ra hai cách để giải quyết vấn đề này:

  1. Xóa fadekhỏi lớp, vì vậy hộp thoại sẽ hiển thị ngay sau khi gọi .modal('show'). Bạn có thể xem http://codebins.com/bin/4ldqp7x/4 để xem demo. (Xin lỗi @keyur, tôi đã chỉnh sửa và lưu nhầm thành phiên bản mới của ví dụ của bạn)
  2. Gọi focus()trong shownsự kiện như những gì @keyur đã viết.

Cảm ơn bạn. Tôi ước tôi có thể gắn thẻ hai câu trả lời là đúng: p. Có, tôi thậm chí không muốn "fade" có hiệu lực, vì vậy loại bỏ nó hoạt động. Tôi loại bỏ mờ dần và thêm sự kiện hiển thị.
jdkealy

4

Tôi đã tạo một cách năng động để gọi từng sự kiện tự động. Nó hoàn hảo để tập trung vào một lĩnh vực, bởi vì nó gọi sự kiện chỉ một lần, loại bỏ nó sau khi sử dụng.

function modalEvents() {
    var modal = $('#modal');
    var events = ['show', 'shown', 'hide', 'hidden'];

    $(events).each(function (index, event) {
        modal.on(event + '.bs.modal', function (e) {
            var callback = modal.data(event + '-callback');
            if (typeof callback != 'undefined') {
                callback.call();
                modal.removeData(event + '-callback');
            }
        });
    });
}

Bạn chỉ cần gọi modalEvents()trên tài liệu đã sẵn sàng.

Sử dụng:

$('#modal').data('show-callback', function() {
    $("input#photo_name").focus();
});

Vì vậy, bạn có thể sử dụng cùng một phương thức để tải những gì bạn muốn mà không phải lo lắng về việc loại bỏ các sự kiện mỗi lần.


Đó là những gì tôi cần! Cảm ơn nhé người anh em!
Nhà phát triển

3

Tôi gặp vấn đề tương tự với bootstrap 3 và đã giải quyết như thế này:

$('#myModal').on('shown.bs.modal', function (e) {
    $(this).find('input[type=text]:visible:first').focus();
})

$('#myModal').modal('show').trigger('shown');


0

Sự kiện chương trình Bootstrap

$('#modal-content').on('show.bs.modal', function() {
$("#txtname").focus();

})


-1

Một giải pháp mô-đun sạch hơn và nhiều hơn có thể là:

$(document).ready(function(){
    $('.modal').success(function() { 
        $('input:text:visible:first').focus();
    });  
});

Hoặc sử dụng ID của bạn làm ví dụ thay thế:

$(document).ready(function(){
    $('#modal-content').modal('show').success(function() {
        $('input:text:visible:first').focus();
    });  
});

Mong rằng sẽ giúp ..


Không có chức năng như vậy thành công.
Avinash
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.