Ok, je suis en train de rééditer mon message car je pense que cela pourrait être plus clair.Comment empêcher une fonction d'être exécutée plus d'une fois sur un événement jquery .live
J'ai une page ASP.net avec un gridview etc. Sur les lignes de résultat de la vue quadrillée est une image qui, une fois cliquée, ouvre une fenêtre contextuelle modale (essentiellement une div masquée qui est affichée sur clic). Ce modal, tel qu'il apparaît est rempli dynamiquement par un ajax/json avec un tableau à 2 colonnes, la colonne 1 seulement les lignes de texte, la colonne 2 combinaison de listes déroulantes vides et les cases à cocher (tous ces éléments sont ajoutés au DOM AFTER le chargement de la page principale). J'essaie de remplir les listes de contrôle avec leur disponible via ajax/json quand ils sont cliqués par l'utilisateur, et je veux seulement que cela se produise sur le premier clic seulement et peu importe combien de fois l'utilisateur clique sur cette liste déroulante là après (même après être sorti de foyer et de retour) je ne veux pas voir plus de reprises de la même apparence.
Voici le code qui fonctionne actuellement lorsque vous cliquez sur la liste déroulante, c'est-à-dire que la liste déroulante est remplie. problème Te est si je lâche focus et puis re-cliquez sur le menu déroulant, il se repeuple une liste double de:
<code>
$('#FSSiteName').live('focus', function() {
var $this = $(this);
getFSSites();
//i thought the below line would stop it happening again when i click on the dropdown
$this.unbind('focus');
});
function getFSSites() {
var ddSites = $("#FSSiteName");
$.ajax({
type: "POST",
url: "Circuits_OrderManagementTracker.aspx/getTheSitesList",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
var xmlDoc = $.parseXML(response.d);
var xml = $(xmlDoc);
var FSSitesReturned = xml.find("Table");
$.each(FSSitesReturned, function (index, FSSitesReturned) {
dbname = $(this).find("SiteNames").text()
ddSites.append('<option>' + dbname + '</option>');
});
},
failure: function (msg) {
alert(msg);
}
});
}
</code>
J'ai changé au code ci-dessous des suggestions par vos bons mêmes, mais quand je fais la ci-dessous ma liste déroulante n'est plus peuplée et j'ai aussi essayé .one() qui annonce le même effet.
<code>
$('#FSSiteName').on('click', function() {
var $this = $(this);
//run your alert here if it´s necessary
//alert('Focused for the first time :)');
getFSSites();
//unbind the event to prevent it from being triggered again
$this.off('click');
});
</code>
Espérons que cela soit un peu plus clair pour tous ceux qui souhaitent aider.
avez-vous essayez '.one()': http://api.jquery.com/one/? – varnie
Construisez-vous un cadre pour la réutilisation? Si ce n'est pas le cas, je vous recommande de tirer parti de celui qui fait tout cela pour vous comme [Telerik's Kendo] (http://www.kendoui.com) –
.one() ne le déclenchera qu'une fois par élément de contexte, et non par délégué . –