2013-10-01 9 views
6

Ho una finestra di dialogo dell'interfaccia utente jQuery contenente un modulo a campo unico e la proprietà autoOpen è impostata su false all'inizio. C'è un altro menu dell'interfaccia utente di jQuery nella pagina e la funzione di apertura della finestra di dialogo è vincolante per l'evento click delle voci di menu. Ho cercato di mettere a fuoco l'unico campo modulo della finestra di dialogo quando la finestra di dialogo è aperta al clic delle voci del menu in qualche modo senza fortuna. Per individuare la causa ho anche aggiunto un altro pulsante di test e facendo clic su quel pulsante posso impostare lo stato attivo sul campo modulo. Quindi sono abbastanza sicuro che sia il menu dell'interfaccia utente jQuery che impedisce il focus del campo. Mi chiedo se c'è un modo per aggirare questo vincolo. Qualsiasi intuizione è apprezzata. Grazie!Impossibile impostare lo stato attivo su un campo modulo in una finestra di dialogo dell'interfaccia utente jQuery facendo clic su una voce di menu jQueryUI

html:

<ul id="menu"> 
    <li><a href="#">Item 1</a></li> 
    <li><a href="#">Item 2</a></li> 
</ul> 
</br> 
<button id="btn">Open the dialog</button> 

<div id="dialog" title="Basic dialog"> 
    <form> 
     <input type="text" id="fld" /> 
    </form> 
</div> 

javascript:

$("#dialog").dialog({ 
    autoOpen: false, 
    open: function(event, ui){ 
     $('#fld').focus(); 
    } 
}); 

$('#btn').click(function(e){ 
    $("#dialog").dialog('open'); 
}); 

$('#menu li a').click(function(){ 
    $("#dialog").dialog('open'); 
}) 

$("#menu").menu({ 
    select: function(event, ui) { 
     $("#dialog").dialog('open'); 
    } 
}); 

Ecco la js fiddle

risposta

9

Interessante.

Il menu di jQuery influisce sull'accensione in qualche modo. Stavo osservando il tuo violino e ho scoperto che anche se si ritarda la messa a fuoco 1 millisecondo funziona.

Dai un'occhiata a questo.

$("#dialog").dialog({ 
    autoOpen: false, 
    open: function(event, ui){ 
     setTimeout(function(){$('#fld').focus();},1); 
    } 
}); 

$('#btn').click(function(e){ 
    $("#dialog").dialog('open'); 
}); 

$('#menu li a').click(function(){ 
    $("#dialog").dialog('open'); 
}) 

$("#menu").menu(); 

http://jsfiddle.net/XMEWu/1/

+0

Ciao @Trevor, ho provato il vostro violino fuori un po 'e sembra che ogni volta che la pagina viene caricata, il primo clic sulle voci di menu non impostare la messa a fuoco e tutti i clic in seguito funzionano perfettamente. È decisamente più vicino a quello che voglio. Apprezzo il tuo aiuto. – aarryy

+0

Ciao @Trevor, ho testato la tua soluzione con la mia soluzione reale e sorprendentemente ha funzionato. Non riesco a vedere la logica dietro a ciò. Probabilmente è perché la soluzione reale non sta usando la stessa identica versione dell'interfaccia utente jquery e jquery. Comunque grazie per tutto l'aiuto. – aarryy

+0

Il tuo benvenuto, è strano per me, funziona per la prima volta. Vai a capire. – Trevor

1

all'uso su Dialog pagina

$(window).load(function() { 
    //Use Focus as $("#stsr").focus(); 
} 
+0

Questa è anche una buona soluzione. Qualche spiegazione: l'evento open per la finestra di dialogo non "aspetta" per il caricamento del codice HTML, viene eseguito non appena viene aperta la finestra di dialogo e questo è il vero problema qui. Aggiunta funzione su $ (finestra).caricare o $ (document) .ready in html della finestra di dialogo attende che il codice sia completamente caricato prima di chiamare la funzione, risolvendo così il problema di input di messa a fuoco che non esiste ancora. Penso che questa potrebbe essere la soluzione migliore, quindi impostare il timeout. – vove

1

Questo mi ha spinto pazzo. Ecco cosa lo ha risolto per me (versione più generica della risposta di @ Trevor).

$('#element').dialog({ 
    open: function() {       
    //focus fix 
    $('textarea, input', $(this)).click(function() { 
     var $inp = $(this); 
     setTimeout(function() { 
      $inp.focus(); 
     }, 1); 
    });       
    } 
}); 
Problemi correlati