2011-09-01 1 views
2

J'ai un <select> et je gère l'événement change(). Lorsque l'utilisateur modifie l'option de sélection, je souhaite effectuer une série d'actions. Mais, si je déclenche le changement via $(item).trigger('change') alors je ne veux pas effectuer cette série d'actions.jQuery - Déterminer l'utilisateur par rapport à l'événement programmatique

Je vois trigger() contains une surcharge avec des paramètres. Je ne suis pas sûr si cela fonctionnera car je n'ai pas écrit un événement personnalisé. Alors, que dois-je faire pour déterminer la différence entre un événement déclenché par l'utilisateur et mon événement déclenché par programme?

+0

hmm ... pourquoi déclencher l'événement? Doit-il y avoir un effet secondaire que vous recherchez? Y a-t-il un code de gestionnaire de changement qui doit être exécuté indépendamment de l'utilisateur par rapport au programmatique? – dotjoe

+0

@dotjoe - un peu beaucoup à expliquer. Fondamentalement, je fais un site Web se comporter comme une application de bureau. J'ai besoin de déclencher des événements dans un certain ordre afin d'éviter les conditions de course avec mes requêtes $ .get(). –

Répondre

1

est ici un moyen rapide et sale pour le faire:

var progChange = false; 

$('select').change(function() { 
    if (!progChange) { 
     // Do user actions...    
    } 
    progChange = false; 
}); 

function callSelectChange() { 
    progChange = true; 
    $('select').change(); 
} 

Vous pouvez le faire avec la méthode trigger essentiellement de la même manière, et il éliminerait l'échelle mondiale, ce qui est une bonne chose:

$('select').change(function(event, progChange) { 
    if (!progChange) { 
     // Do user actions... 
    } 
}); 

$('select').trigger('change', [true]); 

exemple de travail: http://jsfiddle.net/FishBasketGordo/XsPc5/

+0

Vous pouvez utiliser $ ('select'). Data ('progchange') au lieu d'une variable globale. En outre, je ne vois pas pourquoi vous définissez progChange sur false dans le bloc if. Si c'est en cours d'exécution, c'est déjà faux. – vhallac

+0

Oui, les globals sont mauvais comme ce qui se passe quand ce type d'événement se produit sur 2 nœuds différents? – jyore

+0

C'est ce qu'on appelle le quick-and-dirty pour une raison. La deuxième méthode est certainement la meilleure façon de procéder. – FishBasketGordo

3

vous ne pouvez pas le faire normalement, mais, vous pouvez simuler en passant un drapeau de votre programmtic ca ll.

$('.selector').bind('click', function(event,data) { 
    if(typeof(data.programmatic) === 'undefined') { 
     //Do user stuff here 
    } else { 
     //Do progammatic stuff here 
    } 
}); 

//Call programmitcally 
$('.selector').trigger('click',{programmatic:true}); 
+1

+1 - C'est une bonne réponse. J'ai choisi l'autre réponse simplement parce que je trouve le .change() plus facile à lire que la méthode .bind(). Je n'ai pas utilisé une variable globale. –

+0

Avantage de lier, vous pouvez configurer plusieurs événements ou événements personnalisés. Par exemple: '$ ('. Selector'). Bind ({click: function() {...}, changez: function() {...}, mouseover: function() {...}})' ou '$ ('. selector'). bind ('myEvent', function() {...});'. L'autre est simplement une manière abrégée d'utiliser bind, qui appelle en réalité bind. Celui que vous préférez ou aimez est le meilleur bien sûr :) – jyore

Questions connexes