2012-08-30 16 views
174

我已經看到有關自舉模態的幾個問題,但沒有一個完全像這樣,所以我會繼續。如何設置Bootstrap模態中特定字段的焦點,一旦出現

我有打電話的onclick像這樣一個模式...

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

這工作得很好,但當我拿出我想要合焦的第一輸入元件的模式......在可區分的第一個輸入元素的ID爲#photo_name。

所以,我想

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

但這無濟於事。最後,我嘗試綁定'show'事件,但即便如此,輸入也不會集中。最後只是爲了測試,因爲我有一個suspiscion這是關於js加載順序,我把一個setTimeout只是爲了看看我是否延遲了一秒,焦點工作,是的,它的工作原理!但這種方法顯然是廢話。有沒有一些方法可以在不使用setTimeout的情況下獲得如下效果?

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

一個細節博客:HTTP ://goo.gl/2fcB4O –

回答

348

試試這個

這裏是老DEMO

編輯: (下面是一個自舉3和jQuery 1.8.3工作DEMO

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

啓動引導程序3需要使用shown.bs.modal事件:

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

謝謝。我沒有看到「展示」事件。正是我在找什麼。 – jdkealy

+0

謝謝!該演示不再工作,但片段確實如此。 – Kreker

+0

@keyur在codebins.com這個事件在模態顯示後開始,如果我必須在顯示模態之前啓動事件怎麼辦 –

6

看來,這是因爲模式的動畫已啓用(類對話框的fade),調用.modal('show')後,對話框不是立即可見,因此它不能在這個時候獲得焦點。

我能想到的兩種方法來解決這個問題:

  1. 卸下類fade,所以對話是調用.modal('show')後立即可見。您可以在演示中看到http://codebins.com/bin/4ldqp7x/4。 (對不起@keyur,我錯誤地編輯並保存爲您的示例的新版本)
  2. 致電focus()shown事件,如@keyur寫了什麼。
+0

謝謝。我希望我能標記兩個答案作爲corrent:p。是的,我甚至不希望「褪色」效果,所以刪除它的作品。我刪除了淡入淡出並添加了顯示的事件。 – jdkealy

9

我在我的佈局以此來捕獲所有情態動詞,並專注於第一輸入

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

甜。我的第一個輸入元素是隱藏的,所以我認爲我必須這樣做: $(this).find('input:not([type = hidden])')。focus(); – jdkealy

+2

或'$(this).find('input:visible')。focus();' –

+2

應該是$(this).find('input')。first()。focus()如果你不想聚焦所有輸入 – Prozi

-1

一點更清潔,更模塊化的解決方案可能是:

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

或使用ID爲例:

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

Hope這有助於..

+0

沒有這樣的功能成功。 – Avinash

73

只是想說Bootstrap 3處理這個有點不同。活動名稱是「shown.bs.modal」。

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

或把重點放在第一個可見的輸入是這樣的:

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

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

+0

如果我使用.on('show.bs.modal')沒有顯示,它對我有效 –

+0

我花了很多時間看到它應該是「shown.bs ...」而不是「show.bs ..」 「。顯示不適合我。其實他們都在工作,他們是不同的事件。對不起,我忽略了第一句話 – Vladyn

2

我曾與引導3同樣的問題,解決這樣的:

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

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

我有與自舉3相同的問題,重點是當我點擊鏈接,但不是當t用javascript來裝配事件。 解決方案:

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

可能它是關於動畫的東西!

+0

模態動畫肯定會有一些事情發生。即使我在選項中關閉了模式淡入淡出功能,如果在模態彈出窗口之後有CPU密集型任務,它也不會呈現。使用這個超時是我可以使其工作的唯一方法。 – krx

8

我有問題趕上 「shown.bs.modal」 事件。而這是我的解決方案,它可以完美運行..

上()代替簡單:

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

上使用()與委託元素:

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

我創建了一個動態的方式來自動調用每個事件。它非常適合集中一個領域,因爲它只需調用一次該事件,並在使用後將其刪除。

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

你只需要在文件準備好時打電話modalEvents()

用途:

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

所以,你可以使用相同的模式來加載你想要的東西,而不擔心刪除事件每次。

+0

這就是我需要的!多謝兄弟! –

0

引導模式顯示事件

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

})

相關問題