donc j'ai les balises d'ancrage sous forme de <a href='[link'] rel='Tab'>
et je demande ce qui suit à la charge de la page « document prêt » :(Je veux dire)Comment lier la fonction aux événements DOM une fois et une seule fois afin qu'ils ne s'exécutent pas une seconde fois dans le déclenchement de l'événement?
jQuery("a[rel*=Tab]").click(function(e) {
e.preventDefault();//then I do some stuff to open it in jq ui tab}
maintenant le problème est que quand je fais cela et plus tard par javascript nouveau les liens sont générés, dans mon cas avec le chargement d'une deuxième page avec JqGrid il y a de nouveaux <a rel='neoTab'>
qui n'existaient pas quand je lance jQuery("a[rel*=Tab]").click(function(e)
pour qu'ils ne fonctionnent pas ... donc je peux exécuter jQuery("a[rel*=Tab]").click(function(e)
à chaque événement qui crée de nouveaux liens mais alors les anciens liens chargeraient plusieurs onglets alors est-il possible de sélectionner tous les "a[rel*=Tab]
" qui n'étaient pas sélectionnés avant? Je peux et ai déjà résolu cela par une approche algorithmique comme vous pouvez le voir à travers les détails ci-dessous, je pense juste qu'il y a quelques syntaxes que je ne connais pas pour éviter le besoin d'utiliser ce hack!
Détails: Unnecessary
var neoTabitStat = 0;
var openTabs = new Array();
openTabs[0] = 'inbox';
if(!(currentBox=='inbox'||currentBox=='outbox')) {var currentBox = 'inbox';}
function initNeoTab(a){
if(neoTabitStat==0) {
jQuery("a[rel*="+a+"]").click(function(e) {
e.preventDefault();
tabIt(jQuery(this).attr('href')+'&nohead=1',jQuery(this).attr('title'),jQuery(this).attr('data-hovercard'));
});
neoTabitStat++;
}
}
function tabIt(a,b,c) {
c = typeof(c) != 'undefined' ? c : 0;
lastOpen = openTabs.length;
if(lastOpen<6) {
if(openTabs.indexOf(c)<0) {
openTabs[lastOpen] = c;
jQuery("#tabs").tabs("add" , a , b, lastOpen+1);
}
$tabs.tabs('select', openTabs.indexOf(c));
}else{
var tabErrDig = jQuery('<div style="display:hidden">You have opened the maximum amount of tabs please close one to open another tab.</div>').appendTo('body');
tabErrDig.dialog({width:500,title:'Maximum Tabs Opened',modal: true,
buttons: {
Ok: function() {
jQuery(this).dialog("close");
}
}
});
}
}
jQuery(document).ready(function() { initNeotab('nameOfrelAttr4existingLinks'); }
myGrid = jQuery("#list").jqGrid({/*alot of stuff...*/} , gridComplete: function() { initNeotab('nameOfrelAttr4generatedLinks');
}
MISE À JOUR: comme suggéré Wrikken jQuery() vivre je l'ai vérifié et il est exactement ce que je dois, mais je ne peux pas le faire pour réellement travailler. , cela ne fonctionnera pas dans certains cas. Pour tout le monde qui a écrit des solutions différentes, êtes-vous familier avec .live() si oui, pourquoi est-ce que je ne peux pas l'utiliser ici?
CONCLUSION grâce à fudgey, patrick dw et wrikken. Toutes les réponses ont été utiles. .delegate(). travaillé pour moi, mais pour une raison quelconque .live() n'a pas. quelque chose sur la façon jqGrid ajouter des éléments à la table. Je vais garder la question ouverte pendant un moment. Merci encore beaucoup pour toute votre aide. 1 à tous
Qu'avez-vous essayé? Pourriez-vous poster le code? De plus, les éléments '' sont-ils ajoutés au conteneur '# list'? Je suggère vraiment d'utiliser '.delegate()'. C'est la même chose que '.live()' mais le localise sur un conteneur spécifique. Plus efficace de cette façon. – user113716
@patrick oui J'ai fini par utiliser delegate pour le moment car tout était ajouté à #list. car c'est l'identifiant de la table sur laquelle travaille jqGrid. Je pense qu'il y aurait de meilleures solutions avec les méthodes de jqGrid donc je vais attendre quelques réponses de la part des experts de jqGrid et en attendant l'étudier moi-même, mais j'ai le code qui marche jusqu'à présent. – Neo