2009-07-08 6 views
4

J'utilise jquery pour garder le focus sur une zone de texte lorsque vous cliquez sur une div spécifique. Cela fonctionne bien dans Internet Explorer mais pas dans Firefox. Aucune suggestion?Prévention du flou lorsque l'utilisateur clique sur une variable spécifique ne fonctionnant pas dans Firefox

var clickedDiv = false; 

$('input').blur(function() { if (clickedDiv) { $('input').focus(); } }); 

$('div').mousedown(function() { clickedDiv = true; }) 
     .mouseup(function() { clickedDiv = false }); 

Répondre

4

Point à noter: la méthode de mise au point() sur un objet jquery ne se concentre pas réellement: il juste le cas du gestionnaire de mise au point à appeler! de se concentrer réellement l'élément, vous devez faire ceci:

var clickedDiv = false; 
$('input').blur(function() { 
    if(clickeddiv) { 
     $('input').each(function(){this[0].focus()}); 
    } 
} 
$('div').mousedown(function() { clickedDiv = true; }) 
     .mouseup(function() { clickedDiv = false }); 

Notez que je l'ai utilisé la méthode de mise au point() sur les objets DOM natifs, pas des objets jquery.

Ceci est un changement direct (force brute) de votre code exact. Toutefois, si je comprends bien ce que vous essayez de faire correctement, vous essayez de mettre au point une zone de saisie lorsqu'un clic particulier est cliqué sur lorsque cette entrée est active.

Voici mon point de vue sur la façon dont vous le feriez:

var inFocus = false; 
$('#myinput').focus(function() { inFocus = true; }) 
      .blur(function() { inFocus = false; }); 
$('#mydiv').mousedown(function() { 
    if(inFocus) 
     setTimeout(function(){ $('#myinput')[0].focus(); }, 100); 
} 

Point à noter: J'ai donné un délai d'attente pour focaliser l'entrée en question, de sorte que l'entrée peut effectivement sortir de se concentrer dans la temps moyen. Dans le cas contraire, nous nous concentrerions avant de le perdre. Quant à la décision de 100 ms, c'est vraiment un coup de chance ici.

Cheers,

HJR


EDIT en réponse à @ commentaire

Jim La première méthode probablement ne fonctionnait pas parce qu'il était la mauvaise approche pour commencer.

Quant à la deuxième question, nous devrions utiliser .focus() sur l'objet DOM natif et non sur l'emballage jQuery autour parce que la méthode .focus() native fait l'objet de saisir réellement mise au point, alors que la méthode jquery appelle simplement le gestionnaire d'événements associée à l'événement focus. Par conséquent, alors que la méthode jquery appelle le gestionnaire d'événements de focus, la méthode native accorde effectivement le focus, , ce qui provoque l'appel du gestionnaire. C'est juste une nomenclature malheureuse que le nom de cette méthode se chevauche.

+0

Merci pour la réponse rapide. Cependant, la première solution que vous avez écrite n'a pas fonctionné dans les deux navigateurs. Aussi, je suis curieux de savoir pourquoi je devrais utiliser focus() sur un élément DOM natif au lieu de focus() sur un objet jquery car selon la documentation de jquery: Pour se concentrer sur une zone de saisie de connexion avec l'identifiant 'login' sur démarrage de la page, essayez: $ (document) .ready (function() { $ ("# login").concentrer(); }); Votre autre solution est assez chouette, mais est-il possible d'annuler le flou au lieu d'attendre de se concentrer à nouveau? Merci. –

+0

Vous devez définir le délai d'expiration à 0 ms, afin qu'il s'exécute dès que le thread devient inactif. Sinon, vous pouvez voir un clignotement de focus sur un autre élément. L'événement de flou n'est pas annulable. –

+0

@Andy hm. Merci pour le conseil :) – jrharshath

1

Je résolus par simplement remplacer le cas de flou par document.onclick et vérifier l'élément cliqué sinon entrée ou div

var $con = null; //the input object 
var $inp = null; // the div object 

function bodyClick(eleId){ 
    if (eleId == null || ($inp!= null && $con != null && eleId != $inp.attr('id') && 
      eleId != $con.attr('id'))){ 
     $con.hide(); 
    } 
} 
function hideCon() { 
    if(clickedDiv){ 
     $con.hide(); 
    } 

} 
function getEl(){ 
var ev = arguments[0] || window.event, 
origEl = ev.target || ev.srcElement; 
eleId = origEl.id; 
bodyClick(eleId); 
} 
document.onclick = getEl; 

hope u trouvent utile

Questions connexes