2013-03-18 20 views
52

Ho il seguente form modale da esempio:Twitter bootstrap campo di inserimento modale attenzione

<!-- Button to trigger modal --> 
<a href="#myModal" role="button" class="btn" data-toggle="modal">Launch demo modal</a> 

<!-- Modal --> 
<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 
    <div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 
    <h3 id="myModalLabel">Modal header</h3> 
    </div> 
    <div class="modal-body"> 
    Enter something: <input type="text" id="myInput"> 
    </div> 
    <div class="modal-footer"> 
    <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button> 
    <button class="btn btn-primary">Save changes</button> 
    </div> 
</div> 

voglio che il mio campo di input da mettere a fuoco dopo modale viene mostrato.
Ho provato sia l'autofocus che l'attivazione del campo di messa a fuoco sull'evento $('modal').shown(). Si focalizza sul campo (ho un altro evento che mostra l'etichetta quando il campo è focalizzato) ma in realtà il campo non è focalizzato e devo premere TAB per focalizzarlo di nuovo. Ho anche provato qualcosa di simile:

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

e l'impostazione attributo autofocus:"autofocus" per il mio campo. Ha dato lo stesso effetto.
Tutto ciò che ho provato funziona per quando mod è solo un normale div, si focalizza sul caricamento della pagina. Ma quando modale viene attivato dal pulsante - non funziona nulla (sicuramente cambio anche la logica, quando modal è solo un normale div, posso concentrarlo su onload, quando faccio il trigger per pulsante lo prendo in considerazione e cerco di risolverlo di conseguenza).

Quello che voglio è solo il campo da mettere a fuoco dopo che il modale è stato caricato, in modo che abbia il cursore lampeggiante e l'utente possa semplicemente iniziare a digitare.

L'unica cosa che ha funzionato sta cambiando bootstrap.js stessa, ho messo da qualche parte dentro $("#myInput").focus() bootstrap.js sezione modale ma ben Ho dimenticato dove era, e la seconda - penso che non è bene cambiare bootstrap.js API, ci deve essere una soluzione più semplice ed elegante. mi consiglio per favore, grazie xD

UPDATE:
Prima di tutto, grazie per il vostro aiuto! Grazie a te ho capito che il problema che ho avuto è il problema di Rails.

Ecco cosa ho fatto:
1). rails generate controller home index
2). app/views/home/index.html e app/beni/javascript/something.js sono come in questo jsFiddle fornito da robertklep: http://jsfiddle.net/JCaFp/
4). jquery-1.9.1.js e bootstrap.js sono in app/beni/javascript/ (entrambi sono freschi dal sito, non è cambiato nulla)
5). app/views/layout/application.html.erb - Credo che questo file è la chiave della nostra soluzione:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Udc</title> 
    <%= stylesheet_link_tag "application", :media => "all" %> 
    <%= javascript_include_tag "application" %> 
    <%= csrf_meta_tags %> 
</head> 
<body> 

<%= yield %> 

</body> 
</html> 

ancora non funziona. Tutti i file js vengono inclusi, ma quando apro la mia modal nel browser - l'input si concentra per un momento e diventa di nuovo sfocato.

Inoltre ho provato questo:

<%= javascript_include_tag "jquery" %> 
    <%= javascript_include_tag "bootstrap" %> 
    <%= javascript_include_tag "somehow" %> 

Ancora stessa roba.
Suggerimenti? :)

UPDATE:

risolto!

Dopo aver cambiato il mio somehow.js a

$(document).ready(function() { 
    $(".modal").on('shown', function() { 
     $(this).find("[autofocus]:first").focus(); 
    }); 
}); 

e application.html.erb foglio di stile a:

<%= javascript_include_tag "jquery" %> 
    <%= javascript_include_tag "bootstrap" %> 
    <%= javascript_include_tag "somehow" %> 

funziona come previsto. Grazie ancora!

+5

Il codice all'interno del gestore 'shown' funziona bene per me (a condizione che effettivamente impostare l'attributo' autofocus', altrimenti il ​​selettore non lo troverà): [demo qui] (http://jsfiddle.net/JCaFp/) – robertklep

+0

robert, puoi aggiungere il tuo commento come risposta? Lo contrassegnerò come quello giusto :) – konnigun

risposta

7

Basta cambiare $(this).find("[autofocus]:first").focus(); a $(this).find("#myInput").focus(); ha funzionato per me. Se hai modificato l'API Bootstrap e desideri annullare la modifica, puoi sempre scaricare e sostituire il file.

3

Penso che la risposta aggiornata sia abbastanza intelligente. Ecco un altro modo per risolverlo.

Il file js di Bootstrap 3.2 include uno script per gestire lo stato attivo durante e dopo la transizione della dissolvenza del modale. Ciò interferisce con qualsiasi jQuery, javascript o rails + HTML5 concentrandosi su un campo modulo nel modale - bootstrap rimuove lo stato attivo dopo i carichi modali.

Per rimuovere la capacità di bootstrap di ignorare la vostra attenzione, come commento questa linea nell'area dello script modale:

transition ? 
    that.$element.find('.modal-dialog') // wait for modal to slide in 
     .one($.support.transition.end, function() { 
     // that.$element.focus().trigger(e) 
     // the line above is stealing your focus after modal loads! 
     }) 
     .emulateTransitionEnd(300) : 
    that.$element.focus().trigger(e) 

Ora il vostro campo dovrebbe essere in grado di avere messa a fuoco in qualsiasi forma modale.

+0

Anche io sto vedendo questo. Mi sto chiedendo cosa stia cercando di raggiungere quella linea. Sembra che stia cercando di mettere a fuoco il modale. C'è un modo per approfittare di ciò che il bootstrap sta facendo qui piuttosto che il patching del comportamento delle scimmie? – pschwamb

79

Penso che il nome shown evento cambiato nel Bootstrap 3, come spiegato nel this posta.

Come @MrDBA note, in Bootstrap 3 il nome dell'evento è changed a shown.bs.modal.

Così, per Bootstrap 3 uso:

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

Questo funziona perfettamente per me. Grazie David. – blackwood

+0

Questa è davvero la risposta definitiva, perché anche se si imposta il campo per la messa a fuoco automatica nel controllo HTML, il controllo otterrà il focus per un breve momento mentre appare la finestra di dialogo modale e quindi si perde di nuovo il focus. Grazie. – raddevus

6

Se avete problemi con "shown.bs.modal", è sufficiente impostare un timeout.

setTimeout(function() { 
$('#myInput').focus(); 
}, 500); 
39

Per una soluzione generale che non richiede codice specifico per ogni finestra di dialogo, è possibile utilizzare questo:

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

Mi chiedo ancora perché bootstrap stia specificamente ignorando lo stato attivo e come sia possibile controllarlo. – pschwamb

+1

Doveva abbandonare il: testo per caso (campo password), ma per il resto funziona bene. –

+0

È possibile rimuovere la seguente riga (è ridondante in questo esempio): 'lastfocus = $ (this);' – DigitalDan

10

provare a rimuovere tabindex="-1" e funziona bello.

Quindi cambiare questo:

<div class="modal fade" id="modalID" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 

A tal:

<div class="modal fade" id="modalID" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 
+0

Tutta questa esperienza con la messa a fuoco automatica di un elemento mi ha fatto impazzire finché non ho trovato questa risposta. Rimuovere il tabindex = "- 1" dalla mia finestra di dialogo ha risolto il problema per me! – dkr88

+0

Grazie. Questo ha funzionato per me. – Khaleel

+0

Oh mio, questo risolve anche il problema. Merita più voti! Ma probabilmente c'è un motivo per cui tabindex è -1. Mi chiedo se rompiamo qualcosa rimuovendo questo. –

0

si può fare: esempio

<%= f.text_field :first_name, class: "form-control", placeholder: "Enter first name", autofocus: true%> 

Basta aggiungere questo: messa a fuoco automatica: vero

6

I rimosso t abindex = "- 1" e funziona così bene.

Il mio codice HTML prima delle variazioni:

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 

Il mio codice HTML dopo le modifiche:

<div class="modal fade" id="myModal" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 

Il mio codice di ingresso:

<input id="tblModalNombreConductor" type="text" maxlength="50" placeholder="Ej: Armando Casas" autofocus/> 

e non ho configurazioni nel mio codice Javascript .

+0

Funziona solo una volta per me. Chiusura e riapertura del modale non si concentra. –

0

Si può anche provare

$('#the-modal').on('shown.bs.modal', function(e) { 
    $('#the-input').focus(); 
}); 
Problemi correlati