así que tengo las etiquetas de anclaje en forma de <a href='[link'] rel='Tab'>
y aplico el siguiente en carga de la página :('documento listo' me refiero)¿Cómo vincular la función a los eventos DOM una vez y solo una vez para que no se ejecuten por segunda vez en el desencadenamiento del evento?
jQuery("a[rel*=Tab]").click(function(e) {
e.preventDefault();//then I do some stuff to open it in jq ui tab}
ahora el problema es que cuando hago esto y más adelante a través de JavaScript nueva se generan enlaces, en mi caso con la carga de una segunda página con JqGrid hay nuevos <a rel='neoTab'>
que no existían cuando ejecuté por primera vez jQuery("a[rel*=Tab]").click(function(e)
para que no funcionen ... así puedo ejecutar jQuery("a[rel*=Tab]").click(function(e)
en cada evento que crea nuevos enlaces pero entonces los enlaces antiguos cargarían múltiples pestañas, ¿hay alguna manera de seleccionar todos los "a[rel*=Tab]
" que no fueron seleccionados antes?
nota: puedo y ya han resuelto esto a través de un enfoque algorítmico como se puede ver a través de los detalles a continuación, sólo parece que una sintaxis que no estoy al tanto de para evitar la necesidad de utilizar este truco!
detalles innecesarios:
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');
}
ACTUALIZACIÓN: como Wrikken sugirió jQuery() viven lo he comprobado y es exactamente lo que necesito pero no puede conseguir que funcione realmente. , no funcionará en algunos casos. Para todos los demás que escribieron soluciones diferentes, ¿están familiarizados con .live()? Si es así, ¿por qué no puedo usarlo aquí?
CONCLUSIÓN gracias especiales a fudgey, patrick dw y wrikken. Todas las respuestas fueron útiles. .delegate(). funcionó para mí, pero por alguna razón .live() no. algo sobre la forma en que jqGrid agregan elementos a la tabla. Voy a mantener la pregunta abierta por un tiempo. Muchas gracias de nuevo por toda su ayuda. +1 a todas las
¿Qué has intentado? ¿Podrías publicar el código? Además, ¿se están agregando los elementos '' al contenedor '# list'? Realmente sugeriría usar '.delegate()'. Es lo mismo que '.live()' pero lo localiza en un contenedor específico. Más eficiente de esa manera. – user113716
@patrick sí Terminé usando delegado por ahora ya que todo se estaba agregando a #list. ya que es la identificación de la tabla en la que jqGrid está trabajando. Creo que habría mejores soluciones con los métodos en jqGrid, así que esperaré algunas respuestas de expertos de jqGrid y, mientras tanto, lo estudiaré más, pero hasta ahora el código ha funcionado. – Neo