2010-11-02 5 views
0

Je veux appeler une fonction quand un certain champ devient flou, mais seulement si un certain élément est cliqué. J'ai essayéJquery - appelez la fonction quand flou + clic sur certains éléments?

$('form').click(function() { 
    $('.field').blur(function() { 
     //stuff 
    }); 
}); 

et

$('.field').blur(function() { 
    $('form').click(function() { 
     //stuff 
    }); 
}); 

Mais eux ne fonctionne, je pense qu'il est parce que les événements se produisent en même temps?

+0

Vous êtes _setting_ événements dans les événements ici, vous ne les écoutez pas – Harmen

+0

Les éléments n'ont pas l'état "cliqué" .. sauf si vous voulez dire le bouton radio et le terme approprié est "sélectionné". Alors, que voulez-vous dire exactement dans votre question? –

+0

Nolgren - J'ai édité ma réponse, de toute façon je n'implémenterais pas ce genre de comportement. – netadictos

Répondre

0

HTML

<form> 
    <input class="field" type="textarea" /> 
    <input class="field" type="textarea" /> 
</form> 
<div class="click-me-class" id="click-me">Click Me</div> 
<div class="click-me-class">Click Me Class</div> 

jQuery

$('.field').blur(function() { 
    $('#click-me').click(function(e) { 
     foo = $(this).data('events').click; 
     if(foo.length <= 1) { 
      // Place code here 
      console.log("Hello"); 
     } 
     $(this).unbind(e); 
    }); 
}); 

Vous pouvez le tester ici: http://jsfiddle.net/WfPEW/7/

+0

Cette page de test est géniale! Cela ne fonctionne pas vraiment ... Ce que je veux arriver est que quand je ne clique pas sur l'autre entrée, la boîte d'alerte ne devrait pas être montrée. Dans mes tests il est montré n'importe où je clique. – Himmators

+0

Je vois. J'ai mis à jour la réponse (y compris le lien jsfiddle). Si je comprends bien maintenant, ce devrait être ce dont vous avez besoin. – tinifni

+0

OK. Je l'ai mis à jour une fois de plus après avoir remarqué un défaut. – tinifni

0

Dans la plupart des navigateurs, vous pouvez utiliser document.activeElement pour y parvenir:

$('.field').blur(function(){ 
    if ($(document.activeElement).closest('form').length) { 
     // an element in your form now has focus 
    } 
}); 
0

J'ai édité ma réponse car nous devons prendre en compte le fait que l'événement est toujours respecté.

Ce n'est pas 100% satisfaisant, et je ne recommande pas ce genre de façon compliquée de faire les choses, mais c'est le plus approximatif.

Vous devez utiliser une variable globale pour prendre en compte le fait que le champ était flou. Dans l'événement window, il est automatiquement réinitialisé à 0, mais si le clic sur "click-me" est produit, il est vérifié avant l'événement window, car l'évènement window est barboté plus tard, il arrive immédiatement après le "click-me" cliquez sur l'événement

Working code

$(window).click(function(e) 
       { 
    $("#result").html($("#result").html()+" isBlurred=0<br/>"); 
         isBlurred=0; 
       }); 

var isBlurred=0; 

$('.field').blur(function() { 
     $("#result").html($("#result").html()+" isBlurred=1<br/>"); 
    isBlurred=1; 
}); 

    $('#click-me').click(function(e) {     
     if(isBlurred==1) 
     { 
      $("#result").html($("#result").html()+" clicked<br/>"); 
     } 

    }); 

".field" serait l'entrée et "# click-moi" serait l'élément cliqué une seule fois seulement.

+0

Ceci est similaire à ce que je travaillais depuis un bon moment jusqu'à ce que je réalise que sur chaque flou, il fait un autre gestionnaire de clic pour # click-moi. Alors disons que vous tabulez entre les deux champs .field à quelques reprises avant de cliquer sur # click-me, vous aurez la fonction de clic sur # click-me tir plusieurs fois. – tinifni

+0

En fait, je viens de réaliser que mon code ne corrige que le clic entre les éléments et non le tabulation. C'est un jour triste. Je vais essayer d'en dire plus. – tinifni

+0

Je pense que j'ai finalement trouvé la bonne solution. Voir ma mise à jour Je pense qu'il prend soin du problème que j'ai expliqué dans mon premier commentaire ici. – tinifni