J'utilise jQuery 1.3.2. P>
Il y a un champ d'entrée sous une forme.
En cliquant sur le champ de saisie, vous ouvrez une DIV comme liste déroulante. Le div contient une liste d'éléments. Lorsque la taille de la liste est grande, il y a une barre de défilement verticale dans la DIV.
p>
Pour fermer la liste déroulante lorsque vous avez cliqué à l'extérieur, il existe un événement de flou sur le champ de saisie. p>
Maintenant, le problème est: p>
Chrome (2.0.172) Lorsque nous cliquons sur la barre de défilement, le champ Entrée va perdre la mise au point. Et maintenant, si vous cliquez à l'extérieur, la liste déroulante ne fermez pas (car l'entrée a déjà perdu la mise au point lorsque vous avez cliqué sur la barre SrollBar) P>
dans Firefox (3.5), IE (8), Opera (9.64), Safari () Lorsque nous cliquons sur la barre de défilement, le champ de saisie ne perdra pas la mise au point. Par conséquent, lorsque vous cliquez à l'extérieur (après avoir cliqué sur la srollbar), la liste déroulante fermera. C'est le comportement attendu. P>
Donc, en chrome une fois la barre de défilement cliquée, puis si je clique en dehors de la liste déroulante ne ferme pas. Comment puis-je résoudre ce problème avec Chrome. P>
8 Réponses :
Pourriez-vous peut-être définir l'événement de flou pour tirer aussi la DIV DIV aussi? De cette façon, lorsque l'entrée ou em> la liste déroulante perd la mise au point, elle disparaîtra ... p>
Merci pour votre réponse. Mais si j'ajoute un événement de flou sur la baisse DIV, la liste déroulante sera fermée lorsque le champ Entrée est cliqué. Que je ne veux pas.
Ensuite, faites un chèque pour voir si ni le champ de saisie ni la liste déroulante ne se concentrent. S'ils sont tous les deux flous, supprimez la liste.
L'événement de clic attaché à la liste déroulante DIV ne tire pas le déclenchement lorsque la barre de défilement dans la liste déroulante est cliquée. Je suppose que la barre de défilement n'est pas considérée comme une partie de la div.
Je ne pense pas que vous puissiez ajouter un événement flou à la div. jsfiddle.net/aamir/gqxeq/1
Je suis curieux ...
Vous utilisez la dernière version de chaque navigateur, pourquoi ne pas l'essayer en chrome 4.0.202? P>
Chrome 2 est la dernière version stable
Plus tôt, j'ai également fait face à une telle situation et c'est ce que j'ai fait. et sur le champ d'entrée, je ferai ce p> donc cela fermera la liste déroulante si elle est cliquée n'importe où en dehors de la DIV (même la barre de défilement).
Mais je pensais que si quelqu'un pouvait fournir une solution plus logique. P> p>
J'ai fait la même chose que cela, mais l'a appliqué à l'événement code> coxout code>.
Eh bien, j'ai eu le même problème dans mon contrôle déroulant. J'ai demandé aux développeurs de chrome concernant ce problème, ils ont dit que c'est Un bug A> Cela ne va pas être fixé à l'avenir le plus proche en raison de "il n'a pas été signalé par de nombreuses personnes et le correctif n'est pas trivial". Alors, faisons face à la vérité: ce bug restera pendant une autre année au moins. Cependant, pour ce cas particulier (déroulement), il y a une solution de contournement. L'astuce est la suivante: lorsque vous cliquez sur une barre de défilement, l'événement "Mouse Down" est situé à l'élément propriétaire de cette barre de défilement. Nous pouvons utiliser ce fait pour définir un drapeau et vérifier le gestionnaire "OnBlur". Ici, l'explication: p> "dropdown_wrap" divisera une barre de défilement verticale car son contenu ne correspond pas à une hauteur fixe. Une fois que nous avons obtenu le clic, nous sommes presque sûrs que la barre de défilement a été cliquée et que la mise au point sera retirée. Maintenant, certains code comment gérer ceci: P> search_ctrl.onfocus = function() {
search_has_focus = true
}
search_ctrl.onblur = function() {
search_has_focus = false
if (!keep_focus) {
// hide dropdown
} else {
keep_focus = false;
search_ctrl.focus();
}
}
dropdow_wrap.onclick = function() {
if (isChrome()) {
keep_focus = search_has_focus;
}
}
En essayant, mais pas sûr de la raison pour laquelle il ne fonctionne pas ici: JSBIN.com/idaroq/edit#javaScript , html, vivre
Au lieu de détecter le flou, détectez le document.Body ou Fenêtre cliquez sur le point de la souris. Déterminez si ce point de souris est en dehors de la boîte de menus. Presto, vous avez détecté quand ils ont cliqué devant la boîte! P>
J'ai résolu ceci en procédant comme suit:
#my_container est le conteneur qui a la règle "Overflow: Auto" CSS Rule P>
(>> ADDED THIS) mouse_in_container=false; $('input').attr('active', false); // to blur input $('#my_container').hide();
Je faisais face à la même situation / à la même question et j'ai testé la solution de "iHsoft", mais cela a des problèmes. J'ai donc travaillé sur une alternative pour cela et je n'ai fait qu'une seule fois que "ihsoft" mais celui qui fonctionne. Voici ma solution:
var hide_dropdownlist=true; search_ctrl.onblur = function() { search_has_focus = false if (hide_dropdownlist) { // hide dropdown } else { hide_dropdownlist = true; search_ctrl.focus(); } } dropdow_wrap.onmouseover = function() { hide_dropdownlist=false; } dropdow_wrap.onmouseoout = function() { hide_dropdownlist=true; }
Je ne pouvais pas obtenir ces réponses au travail, peut-être parce qu'elles sont à partir de 2009. Je viens de traiter cela, je pense que ihsoft est sur la bonne voie, mais un peu lourds.
avec deux fonctions p> Le truc est dans la manière dont vous liez les éléments. L'événement Onmousedown doit être sur le "conteneur" DIV qui contient tout ce qui va être cliqué (c'est-à-dire la zone de texte, la flèche déroulante et la zone déroulante et sa barre de défilement). L'événement de flou (ou en jQuery l'événement de mise au point) doit être lié directement dans la zone de texte. P> testé et fonctionne! P> P>