2011-07-27 2 views
0

Je crée ma propre fonction pour la première fois $.fn.testing = function(){....};Empêche la fonction d'exécuter deux fois

Mais j'ai un problème que je ne suis pas encore capable de résoudre. Le scénario suivant est pas intelligent, mais il peut arriver, si c'est la raison pour laquelle je veux le corriger afin que l'utilisateur n'a pas à:

$('.target').testing("message" : "Hello!"); 
$('#test .target').testing("message" : "Hello world!"); 

La fonction fera le pop-up « message » . Donc, ce que l'utilisateur veut ici, c'est que pour chaque .target il doit y avoir un pop-upbox avec "Hello!" et si ce .target a aussi un identifiant de #test alors il devrait apparaître: "Bonjour tout le monde!". Mais le problème est que maintenant le script va apparaître "Hello!" ET "Bonjour tout le monde!" lorsque le .target#test est déclenché. Donc, ce que je veux dans ma fonction est que la fonction voit si la fonction est déjà appelée sur cet objet, et si elle l'est, elle doit .unbind() la fonction précédente et continue à ajouter la fonction.

Comment puis-je y parvenir? J'espère que mon explication est assez claire!

(L'exemple ci-dessus est un peu simplifié, alors s'il vous plaît ne pas commenter l'utilisation de celui-ci)

aide est appréciée!

Répondre

2

Voici comment je ferais ceci:

var _myFunction = function() { 
    alert($(this).data("message")); 
}; 

dans le plugin faire quelque chose comme ça

jQuery.fn.testing = function(msg) { 
    this 
     .data("message", msg) 
     .unbind('click', _myFunction) 
     .bind('click', _myFunction); 
}; 

EDIT: ici est un exemple en jsfiddle

+0

Merci pour l'effort! Cela ferait en effet l'affaire! – Milaan

+0

ur wellcome ... contente d'avoir aidé (: – dugokontov

1

Vous pouvez faire:

$('.target#test').testing("message" : "Hello world!"); 
$('.target:not(#test)').testing("message" : "Hello!"); 

EDIT - voulez-vous dire quelque chose comme ça?

$('.target').testing(function(e){ 
    if (this.id === 'event'){ 
     alert('hello world'); 
    }else{ 
     alert('hello'); 
    } 
}); 
+0

C'est en effet très utile, mais l'utilisateur doit le spécifier. Y a-t-il un moyen de faire cela à l'intérieur de la fonction? – Milaan

+0

J'ai édité le post principal, voir le bit de code, comment le feriez-vous maintenant? Merci pour votre réponse d'ailleurs, s'il n'y a pas de moyen possible d'atteindre cela à l'intérieur de la fonction, alors je vais utiliser cela! Merci! – Milaan

+0

Pourriez-vous fournir un exemple plus détaillé? Comme nous montrer le code de votre fonction sinon nous ne pouvons pas comprendre correctement ce que vous essayez d'accomplir. Peut-être poster un exemple sur jsfiddle.net –

0

Essayez cette

var $this. msg; 
$('.target').each(function(){ 
    $this = $(this); 

    if((#this.attr("id) != "#test") || ($this.find("#test").length == 0))//here check for all the possible ids you want){ 
     msg = "message" : "Hello world!"; 
    } 
    else{ 
     msg = "message" : "Hello!"; 
    } 
    $this.testing(msg); 
}); 
+0

cela fonctionnerait en effet, mais je veux que cela se produise à l'intérieur de la fonction elle-même. Ceci est juste un exemple simple, mais s'il devient plus avancé, vous devrez utiliser quelque chose comme: '$ ('. Target'). Filter (": not (#test # test1 # test2 # test3 # test4 # test5 # test6 # test7 # test8 # test9 # test10 etc) "). testing (" message ":" Bonjour! "); 'J'ai édité le post principal, voir le code, comment l'obtiendriez-vous maintenant? Merci pour votre réponse btw! – Milaan

+0

S'il vous plaît vérifier ma réponse éditée espérons que cela aide. – ShankarSangoli

+0

Merci qui aiderait en effet mais si le 'id' était un enfant du' $ (ceci) 'ce ne serait pas. Je n'étais pas vraiment précis dans la question, désolé pour cela. Mais je l'avais déjà figé. Merci pour votre aide! – Milaan

0

Pour autant que je compris: Par exemple, vous avez une fenêtre contextuelle sur la cible jointe à l'élément cible et maintenant le pop-up est un enfant à la cible, ou peut-être que vous pourriez avoir mis en œuvre autrement. Mon point est à chaque fois qu'un appel à la fonction est faite, il va vérifier si le popup est inséré dans DOM. Si c'est le cas, cela supprimera ce popup et en insérera un nouveau avec un nouveau message.

Je veux dire ... Comme

function() { 
     //if a pop is present 
     $('.popup').remove(); 

     var msg = $(this).attr('title'); //for example 
     var popup = "html containin msg..."; 
     $(this).append(popup); 
    } 
+0

Merci de votre aide! Mais je l'ai déjà. Merci de votre aide – Milaan

0

Je ne sais pas si c'est la bonne façon de le faire, mais je l'ai moi-même figuré. C'était très facile, il suffit d'ajouter $(this).unbind() au début de votre propre fonction. Il supprimera toutes les fonctions précédemment ajoutées et continuera à ajouter l'actuel. Je l'avais essayé avant mais avec un sélecteur supplémentaire: $(this).unbind(".testing"), cela n'a pas fonctionné pour une raison quelconque mais maintenant je l'ai fonctionné.

Merci pour vos réponses et votre aide! J'apprécie beaucoup!

Questions connexes