Eu configurei uma caixa de diálogo modal da interface do usuário do jQuery para exibir quando um usuário clica em um link. Existem duas caixas de texto (mostro apenas o código 1 por questões de concisão) nessa tag div de diálogo e ela é alterada para ser uma caixa de texto jQuery UI DatePicker que reage ao foco.
O problema é que a caixa de diálogo da interface do usuário do jQuery ('open') aciona a primeira caixa de texto para focar, o que aciona o calendário do datepicker para abrir imediatamente.
Então, estou procurando uma maneira de impedir que o foco aconteça automaticamente.
<div><a id="lnkAddReservation" href="#">Add reservation</a></div>
<div id="divNewReservation" style="display:none" title="Add reservation">
<table>
<tr>
<th><asp:Label AssociatedControlID="txtStartDate" runat="server" Text="Start date" /></th>
<td>
<asp:TextBox ID="txtStartDate" runat="server" CssClass="datepicker" />
</td>
</tr>
</table>
<div>
<asp:Button ID="btnAddReservation" runat="server" OnClick="btnAddReservation_Click" Text="Add reservation" />
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
var dlg = $('#divNewReservation');
$('.datepicker').datepicker({ duration: '' });
dlg.dialog({ autoOpen:false, modal: true, width:400 });
$('#lnkAddReservation').click(function() { dlg.dialog('open'); return false; });
dlg.parent().appendTo(jQuery("form:first"));
});
</script>
javascript
jquery
jquery-ui
slolife
fonte
fonte
Respostas:
O registro de alterações da interface do usuário do jQuery 1.10.0 lista o ticket 4731 como sendo corrigido.
Parece que o focusSelector não foi implementado, mas uma pesquisa em cascata de vários elementos foi usada. Do bilhete:
Portanto, marque um elemento com o
autofocus
atributo e esse é o elemento que deve receber o foco:Na documentação , a lógica do foco é explicada (logo abaixo do índice, sob o título 'Foco'):
fonte
Adicione um espaço oculto acima dele, use ui-helper-hidden-affordable para torná-lo oculto por posicionamento absoluto. Eu sei que você tem essa classe porque está usando o diálogo do jquery-ui e está no jquery-ui.
fonte
Na interface do usuário do jQuery> = 1.10.2, você pode substituir o
_focusTabbable
método do protótipo por uma função placebo:Violino
Isso afetará todos os
dialog
s na página sem a necessidade de editar cada um manualmente.A função original não faz nada além de definir o foco para o primeiro elemento com
autofocus
atributo /tabbable
elemento / ou retornar ao próprio diálogo. Como seu uso está apenas focando um elemento, não deve haver problema em substituí-lo por umnoop
.fonte
$.noop
, substitua-o por uma função que anote a caixa de diálogo ativa e registre um manipulador de eventos de chave global que intercepteESC
e feche a caixa de diálogo 'ativa', se houver uma.A partir do jQuery UI 1.10.0, você pode escolher em qual elemento de entrada focar usando o foco automático do atributo HTML5 .
Tudo o que você precisa fazer é criar um elemento fictício como sua primeira entrada na caixa de diálogo. Absorverá o foco para você.
Isso foi testado no Chrome, Firefox e Internet Explorer (todas as versões mais recentes) em 7 de fevereiro de 2013.
fonte
Eu encontrei o seguinte código na função de diálogo da interface do usuário do jQuery para abrir.
Você pode solucionar o comportamento do jQuery ou alterar o comportamento.
tabindex -1 funciona como uma solução alternativa.
fonte
focusSelector
opção) deve estar no jQueryUI 1.8, e agora estamos na 1.8.13 e não a vejo nos documentos da caixa de diálogo do jQueryUI . O que aconteceu com isso?Apenas descobri isso enquanto brincava.
Eu descobri com essas soluções para remover o foco, fazendo com que a ESCchave parasse de funcionar (por exemplo, feche a caixa de diálogo) ao entrar pela primeira vez no Diálogo.
Se a caixa de diálogo for aberta e você pressionar imediatamente ESC, ela não será fechada (se você a tiver ativado), porque o foco está em algum campo oculto ou algo assim e não está recebendo eventos de pressionamento de tecla.
A maneira como eu o corrigi foi adicionar isso ao evento aberto para remover o foco do primeiro campo:
Isso define o foco na caixa de diálogo, que não é visível, e a ESCchave funciona.
fonte
Defina o tabindex da entrada como -1 e, em seguida, defina dialog.open para restaurar o tabindex, se necessário posteriormente:
fonte
Minha solução alternativa:
fonte
:first
seletor ou.first()
no FF / Chrome / IE9. Jogá-lo nadialogopen
ligação também funciona.open: function(){ $('a').blur(); // no autofocus on links }
Eu tinha um conteúdo que era mais longo que o diálogo. Ao abrir, a caixa de diálogo passaria para a primeira: tabbable que estava na parte inferior. Aqui estava a minha correção.
fonte
$('...').blur();
vez de rolar.Solução simples:
Basta criar um elemento invisível com tabindex = 1 ... Isso não focalizará o datepicker ...
por exemplo.:
fonte
Aqui está a solução que eu implementei depois de ler o ticket jQuery UI # 4731 , originalmente publicado por slolife como resposta a outra resposta. (O ticket também foi criado por ele.)
Primeiro, em qualquer método usado para aplicar preenchimentos automáticos à página, adicione a seguinte linha de código:
Isso desativa o comportamento de "foco automático" do jQuery. Para garantir que seu site continue sendo amplamente acessível, agrupe seus métodos de criação de diálogo para que código adicional possa ser adicionado e adicione uma chamada para focar o primeiro elemento de entrada:
Para abordar ainda mais a acessibilidade quando as opções de preenchimento automático são selecionadas via teclado, substituímos o retorno de chamada de preenchimento automático "select" da jQuery UI e adicionamos algum código adicional para garantir que o textElement não perca o foco no IE 8 após fazer uma seleção.
Aqui está o código que usamos para aplicar preenchimentos automáticos a elementos:
fonte
Você pode fornecer essa opção para focar o botão Fechar.
fonte
Esse pode ser um comportamento do navegador, não um problema do plugin jQuery. Você tentou remover o foco programaticamente depois de abrir o pop-up.
Ainda não testei isso, mas deve funcionar ok.
fonte
Eu tive o mesmo problema e o resolvi inserindo uma entrada vazia antes do datepicker, que rouba o foco toda vez que a caixa de diálogo é aberta. Esta entrada está oculta em todas as aberturas da caixa de diálogo e é mostrada novamente no fechamento.
fonte
Bem, é legal que ninguém tenha encontrado a solução no momento, mas parece que tenho algo para você. A má notícia é que o diálogo se concentra em qualquer caso, mesmo que não haja entradas e links. Eu uso a caixa de diálogo como uma dica de ferramenta e definitivamente preciso que o foco permaneça no elemento original. Aqui está a minha solução:
use a opção [autoOpen: false]
Enquanto a caixa de diálogo é invisível, o foco não é definido em nenhum lugar e permanece no local original. Ele funciona para dicas de ferramentas com apenas um texto simples, mas não testado para diálogos mais funcionais, onde pode ser importante ter um diálogo visível no momento da abertura. Provavelmente funcionará bem em qualquer caso.
Entendo que a postagem original era apenas para evitar o foco no primeiro elemento, mas você pode facilmente decidir onde o foco deve estar após a caixa de diálogo ser aberta (após o meu código).
Testado no IE, FF e Chrome.
Espero que isso ajude alguém.
fonte
Na minha opinião, esta solução é muito boa:
Encontrado aqui: incapaz de remover o foco automático na interface do usuário
fonte
Eu tenho um problema similar. Abro uma caixa de diálogo de erro quando a validação falha e ela agarra o foco, assim como Flugan mostra em sua resposta . O problema é que, mesmo que nenhum elemento dentro da caixa de diálogo possa ser tabulado, a própria caixa de diálogo ainda estará focada. Aqui está o código não minificado original de jquery-ui-1.8.23 \ js \ jquery.ui.dialog.js:
O comentário é deles!
Isso é muito ruim para mim por várias razões. O mais irritante é que a primeira reação do usuário é bater no backspace para excluir o último caractere, mas, em vez disso, ele é solicitado a sair da página, porque o backspace é atingido fora de um controle de entrada.
Descobri que a seguinte solução alternativa funciona muito bem para mim:
fonte
Eu estava procurando um problema diferente, mas com a mesma causa. A questão é que o diálogo define o foco para o primeiro
<a href="">.</a>
que encontrar. Portanto, se você tiver muito texto na caixa de diálogo e as barras de rolagem aparecerem, poderá ter a situação em que a barra de rolagem será rolada para baixo. Eu acredito que isso também resolve a questão das primeiras pessoas. Embora os outros também o façam.A correção simples e fácil de entender.
<a id="someid" href="#">.</a>
como a primeira linha na sua caixa de diálogo div.EXEMPLO:
Onde sua caixa de diálogo é iniciada
O item acima não terá nada em foco e as barras de rolagem permanecerão no topo a que pertencem. O
<a>
foco fica mas fica oculto. Portanto, o efeito geral é o efeito desejado.Eu sei que este é um thread antigo, mas, quanto aos documentos da interface do usuário, não há solução para isso. Isso não requer desfoque ou foco para funcionar. Não tenho certeza se é o mais elegante. Mas isso faz sentido e é fácil de explicar para qualquer pessoa.
fonte
Se você tiver apenas um campo na forma de caixa de diálogo Jquery e for o que precisa do Datepicker, como alternativa, basta definir o foco no botão Fechar (cruz) da caixa de diálogo na barra de título da caixa de diálogo:
Chamar esta caixa de diálogo APÓS foi inicializada, por exemplo:
Porque o botão Fechar é renderizado após o
.dialog()
chamado.fonte
Se você estiver usando botões de diálogo, basta definir o
autofocus
atributo em um dos botões:fonte
Eu tenho o mesmo problema.
A solução alternativa que fiz foi adicionar a caixa de texto fictícia na parte superior do contêiner de diálogo.
fonte
Como mencionado, este é um bug conhecido da interface do usuário do jQuery e deve ser corrigido relativamente em breve. Até então...
Aqui está outra opção, para que você não precise mexer com tabindex:
Desative o selecionador de datas temporariamente até que a caixa de diálogo seja aberta:
Funciona para mim.
Pergunta duplicada: Como desfocar a primeira entrada de formulário na abertura da caixa de diálogo
fonte
Para expandir algumas das respostas anteriores (e ignorar o aspecto auxiliar do comparador de datas), se você deseja impedir que o
focus()
evento concentre o primeiro campo de entrada quando a caixa de diálogo for aberta, tente o seguinte:fonte
Eu tive um problema semelhante e o resolvi, concentrando-me no diálogo após aberto:
Mas no meu caso, o primeiro elemento é uma âncora, então não sei se, no seu caso, isso deixará o datepicker aberto.
EDIT: só funciona no IE
fonte
localize em jquery.ui.js
e substitua por
fonte
O jQuery 1.9 é lançado e não parece haver uma correção. Tentar impedir o foco da primeira caixa de texto por alguns dos métodos sugeridos não está funcionando no 1.9. Acho que porque os métodos tentam desfocar o foco ou mover o foco ocorrem APÓS a caixa de texto na caixa de diálogo já ter ganhado foco e feito seu trabalho sujo.
Não vejo nada na documentação da API que me faça pensar que algo mudou em termos de funcionalidade esperada. Desligado para adicionar um botão de abertura ...
fonte
Eu tive um problema semelhante. Na minha página, a primeira entrada é uma caixa de texto com o calendário da UI do jQuery. O segundo elemento é o botão. Como a data já tem valor, defino o botão de foco, mas primeiro adicione gatilho para desfoque na caixa de texto. Isso resolve o problema em todos os navegadores e provavelmente em todas as versões do jQuery. Testado na versão 1.8.2.
fonte
Isso é realmente importante para smartphones e tablets, porque o teclado aparece quando uma entrada tem o foco. Isto é o que eu fiz, adicione esta entrada no início da div:
Não funciona com tamanho
0px
. Eu acho que é ainda melhor com uma imagem transparente real,.png
ou não,.gif
mas ainda não tentei.Até agora, está funcionando bem no iPad.
fonte
Você pode adicionar isso:
...
...
fonte
como primeira entrada:
<input type="text" style="position:absolute;top:-200px" />
fonte