Suponha que eu anexe uma blur
função a uma caixa de entrada HTML como esta:
<input id="myInput" onblur="function() { ... }"></input>
Existe uma maneira de obter o ID do elemento que causou o blur
disparo do evento (o elemento que foi clicado) dentro da função? Quão?
Por exemplo, suponha que eu tenha uma extensão como esta:
<span id="mySpan">Hello World</span>
Se eu clicar no intervalo logo após o elemento de entrada ter o foco, ele perderá o foco. Como a função sabe mySpan
que foi clicada?
PS: Se o evento onclick do span ocorresse antes do evento onblur do elemento de entrada, meu problema seria resolvido, porque eu poderia definir algum valor de status indicando que um elemento específico foi clicado.
PPS: O pano de fundo desse problema é que desejo acionar um controle de preenchimento automático AJAX externamente (a partir de um elemento clicável) para mostrar suas sugestões, sem que as sugestões desapareçam imediatamente devido ao blur
evento no elemento de entrada. Então, eu quero verificar a blur
função se um elemento específico foi clicado e, se sim, ignorar o evento de desfoque.
fonte
Respostas:
Hmm ... No Firefox, você pode usar
explicitOriginalTarget
para puxar o elemento que foi clicado. Eu esperavatoElement
fazer o mesmo para o IE, mas ele não parece funcionar ... No entanto, você pode extrair o elemento recém-focado do documento:Advertência: Essa técnica não funciona para alterações de foco causadas pela tabulação de campos com o teclado e nem funciona no Chrome ou Safari. O grande problema com o uso
activeElement
(exceto no IE) é que ele não é consistentemente atualizado até após oblur
evento foi processado e pode não ter valor válido durante todo o processamento! Isso pode ser atenuado com uma variação na técnica que Michiel acabou usando :Isso deve funcionar nos navegadores mais modernos (testados no Chrome, IE e Firefox), com a ressalva de que o Chrome não concentra os botões nos quais são clicados (vs. tabulado para).
fonte
blur
evento é acionado. Atualizei a resposta com detalhes. Você já tentou usar o activeElement para isso no Chrome ou Firefox? Dá-lhe o elemento fiquem desfocadas ...Resposta 2015 : de acordo com os eventos da interface do usuário , você pode usar a
relatedTarget
propriedade do evento:Para
blur
eventos,Exemplo:
Nota O Firefox não suporta
relatedTarget
até a versão 48 ( bug 962251 , MDN ).fonte
relatedTarget
retornaránull
se o alvo que recebe o foco não for um elemento de entrada.tabIndex="0"
atributo a ele e ele vai funcionarResolvi isso eventualmente com um tempo limite no evento onblur (graças ao conselho de um amigo que não é o StackOverflow):
Funciona tanto no FF quanto no IE.
fonte
É possível usar o evento mousedown do documento em vez do blur:
fonte
As
FocusEvent
instâncias de tipo têmrelatedTarget
atributo, no entanto, até a versão 47 do FF, especificamente, esse atributo retorna nulo, já que 48 já funciona.Você pode ver mais aqui .
fonte
Também estou tentando fazer o Autocompleter ignorar a desfocagem se um elemento específico clicar e tiver uma solução funcional, mas apenas para o Firefox devido a explícitaOriginalTarget
Esse código envolve o método onBlur padrão do preenchimento automático e verifica se os parâmetros ignoreBlurEventElement estão definidos. se estiver definido, ele verifica sempre que o elemento clicado é ignoreBlurEventElement ou não. Se for, o preenchimento automático não chama onBlur; caso contrário, chama onBlur. O único problema é que ele só funciona no Firefox porque a propriedade explícitaOriginalTarget é específica do Mozilla. Agora estou tentando encontrar uma maneira diferente do uso explícitaOriginalTarget. A solução que você mencionou requer que você adicione o comportamento de onclick manualmente ao elemento. Se eu não conseguir resolver o problema explícitoOriginalTarget, acho que seguirei sua solução.
fonte
Você pode reverter o que está verificando e quando? Ou seja, se você se lembrar do que ficou embaçado pela última vez:
e, em seguida, no onClick do seu período, chame function () com os dois objetos:
Sua função pode decidir se deve ou não acionar o controle Ajax.AutoCompleter. A função possui o objeto clicado e o objeto desfocado. O onBlur já aconteceu e não fará com que as sugestões desapareçam.
fonte
Use algo como isto:
E então dentro da sua função:
E depois:
E depois:
Código final:
fonte
Eu acho que não é possibe, com o IE você pode tentar usar
window.event.toElement
, mas não funciona com o Firefox!fonte
Conforme observado nesta resposta , você pode verificar o valor de
document.activeElement
.document
é uma variável global, portanto você não precisa fazer mágica para usá-la no manipulador onBlur:fonte
Portanto, a melhor maneira é usar o evento onclick on body para entender indiretamente que seu nó (event.target) está desfocado
fonte
Funciona no Google Chrome v66.x, Mozilla v59.x e Microsoft Edge ... Solution com jQuery.
Comente seu teste em outras versões do Internet Explorer.
fonte
Edit: Uma maneira hacky de fazer isso seria criar uma variável que controla o foco de todos os elementos importantes para você. Portanto, se você se importa com o foco perdido de 'myInput', defina uma variável para ele em foco.
Resposta original: Você pode passar 'this' para a função.
fonte
Sugiro usar variáveis globais blurfrom e blurto. Em seguida, configure todos os elementos importantes para atribuir sua posição no DOM à variável blurfrom quando eles perderem o foco. Além disso, configure-os para que o ganho de foco defina a variável blurto para sua posição no DOM. Em seguida, você pode usar outra função para analisar os dados do blurfrom e blurto.
fonte
lembre-se de que a solução com explícitaOriginalTarget não funciona para saltos de entrada de texto em entrada de texto.
tente substituir os botões pelas seguintes entradas de texto e você verá a diferença:
fonte
Joguei com esse mesmo recurso e descobri que o FF, IE, Chrome e Opera têm a capacidade de fornecer o elemento de origem de um evento. Eu não testei o Safari, mas acho que pode ter algo semelhante.
fonte
Eu não gosto de usar o tempo limite ao codificar javascript, então eu faria isso da maneira oposta de Michiel Borkent. (Não tente o código por trás, mas você deve ter a ideia).
Na cabeça, algo assim
fonte
Você pode corrigir o IE com:
Parece "explícitaOriginalTarget" para FF.
Antoine And J
fonte
Eu escrevi uma solução alternativa como tornar qualquer elemento focalizável e "desfocável".
Baseia-se em criar um elemento como,
contentEditable
ocultar visualmente e desativar o próprio modo de edição:DEMO
Nota: Testado no Chrome, Firefox e Safari (OS X). Não tenho certeza sobre o IE.
Relacionado: Eu estava procurando uma solução para VueJs; portanto, para aqueles que estão interessados / curiosos em como implementar essa funcionalidade usando a diretiva Vue Focusable, dê uma olhada .
fonte
Deste jeito:
Ou se você anexar o ouvinte via JavaScript (jQuery neste exemplo):
Edit : desculpe. Eu interpretei mal a pergunta.
fonte
Eu acho que é facilmente possível via jquery passando a referência do campo causando o evento onblur em "this".
Por exemplo
Graças
Monika
fonte
Você poderia fazer assim:
fonte
Vejo apenas hacks nas respostas, mas na verdade há uma solução embutida muito fácil de usar: Basicamente, você pode capturar o elemento de foco como este:
https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement
fonte