2010-01-08 7 views
1

J'ai ce code:Affectation de fonction onclick dynamique avec paramètres dynamiques en JavaScript?

document.getElementById('img'+i).onclick = function(){popup_show('popup',array_msg[i]+'|||'+date('Y-m-d',strtotime(lec_date))+'-==-'+str_view_forConflict, 'AddEditSchedule;;popup_drag2;;EditSched;;'+String(array_msg_id[3])+';;view', 'popup_drag', 'popup_exit', 'screen-center', 0, 0);}; 

... mais quand je clique sur l'image, les données de array_msg[i] est les dernières données de la boucle, ce qui signifie l'indice est la longueur de la boucle. J'utilise IE pour cela.

S'il vous plaît donnez-moi une idée sur la façon de faire cela. En FF, cela fonctionne bien car j'utilise setAttribute.

@bobince

document.getElementById('img'+i).onclick= popup_show.bind(window, 'popup',array_msg[i]+'|||'+date('Y-m-d',strtotime(lec_date))+'-==-'+str_view_forConflict,'AddEditSchedule;;popup_drag2;;EditSched;;'+array_msg_id[3]+';;view','popup_drag', 'popup_exit', 'screen-center', 0, 0 ); 
       if (!('bind' in Function.prototype)) { 
        Function.prototype.bind= function(owner) { 
         var that= this; 
         var args= Array.prototype.slice.call(arguments, 1); 
         return function() { 
          return that.apply(owner, 
           args.length===0? arguments : arguments.length===0? args : 
           args.concat(Array.prototype.slice.call(arguments, 0)) 
          ); 
         }; 
        }; 
       } 

Répondre

2

Treby, ceci est la version nettoyée de votre réponse. La fonction anonyme anonyme supplémentaire que vous avez ajoutée n'est pas nécessaire.

for (var i = 0, l = array.length; i < l; i++) { 
    document.getElementById(i + '05').onclick = (function(tmp) { 
    return function() { 
     popup_show(
     "popup", 
     array_msg[tmp] + '|||' + date('Y-m-d', strtotime(lec_date)) + '-==-' + str_view_forConflict, 
     "AddEditSchedule;;popup_drag2;;EditSched;;" + String(array_msg_id[3]) + ";;view", 
     "popup_drag", "popup_exit", "screen-center", 0, 0 
    ); 
    }; 
    })(i); 
} 

Modifié pour fixer problème de fermeture

+0

il y a une erreur: "tmp n'est pas défini" – Treby

+0

Oups, l'a corrigé. –

+0

vous l'avez eu .. votez pour ma question .. merci .. – Treby

2

Vous devez utiliser un closure. Il serait utile si vous avez fourni le code de boucle ainsi que le code qui est exécuté dans la boucle, mais en supposant que vous avez une boucle for norme itérer un tableau, le code devrait fonctionner:

for (var i = 0, l = array.length; i < l; i++) 
{ 
    (function(i) { 
     document.getElementById("img" + i).addEventListener("click", function() { 
      popup_show("popup", array_msg[i] + "|||" + date("Y-m-d", strtotime(lec_date)) + "-==-" + str_view_forConflict, "AddEditSchedule;;popup_drag2;;EditSched;;" + String(array_msg_id[3]) + ";;view", "popup_drag", "popup_exit", "screen-center", 0, 0); 
     }, false); 
    })(i); 
} 

En outre, vous ne devrait pas utiliser setAttribute dans Firefox. Au lieu de cela, utilisez element.onclick ou, de préférence, element.addEventListener, ce qui vous permet d'ajouter plusieurs fonctions à appeler lorsqu'un événement se déclenche et donc cela joue bien avec un autre code (si deux bits de code assignent une fonction à, disons, un événement click dans le forme element.onclick = function() { ..., puis la deuxième affectation remplace la première - pas bon). J'ai utilisé element.addEventListener dans mon exemple de code ci-dessus.

+0

que proposez-vous d'utiliser alors? .sur clic?? – Treby

+0

Oui. 'onclick' est compatible avec plusieurs navigateurs depuis plus d'une décennie. C'est en fait IE, pas Firefox, qui fait que 'setAttribute' est incorrect; De toute façon, vous ne devriez généralement jamais utiliser 'setAttribute' dans un document HTML. (Il a encore des utilisations en XML.) – bobince

+0

comment est-ce que je fais cela .. même comme avec mon code IE .. – Treby

2

Vous avez rencontré le problème de fermeture de variable de boucle. C'est un gotcha très commun dans les langages de style C avec des fermetures, telles que JavaScript et Python. Voir la réponse acceptée de this question pour une solution impliquant la liaison des variables de boucle dans une seconde fermeture.

Un peu moins de solution imbriquée est d'utiliser function.bind():

for (var i= 0; i<something.length; i++) { 
    document.getElementById('img'+i).onclick= popup_show.bind(window, 'popup', 
     array_msg[i]+'|||'+date('Y-m-d',strtotime(lec_date))+'-==-'+str_view_forConflict, 
     'AddEditSchedule;;popup_drag2;;EditSched;;'+array_msg_id[3]+';;view', 
     'popup_drag', 'popup_exit', 'screen-center', 0, 0 
    ); 
} 

cependant, puisque cette méthode est une ECMAScript cinquième édition fonction non prise en charge par la plupart des navigateurs mais il a besoin d'un peu d'aide - voir le fond de this answer pour une mise en œuvre rétrocompatible.

+0

j'ai une erreur détails de l'erreur message: 'null' est nulle ou non un objet ligne: 261 Char: 3 code: 0 la ligne 261 concerne document.getElementById (; popup_drag;) ['target'] = id; – Treby

+0

Impossible de dire vraiment sans le code de cette fonction, mais il cherche un élément avec un ID donné et ne le trouve pas. Je ne sais pas ce que font les points-virgules là-bas; S'il y avait vraiment comme ça dans votre code source ce serait une erreur de syntaxe et ne fonctionnerait pas du tout. – bobince

+0

vérifier ma question: ce que j'ai fait – Treby

1

Fermetures. Vous devez utiliser JavaScript Closures. Voir si les réponses à this question aident.

-1

travail Réponse:

var closures = []; 
for (var i = 0; i < array.length; i++){ 
    closures[i] = (function(tmp) { 
     return function() { 
     document.getElementById(tmp + '05').onclick = function(){popup_show("popup", array_msg[tmp]+'|||'+date('Y-m-d',strtotime(lec_date))+'-==-'+str_view_forConflict, "AddEditSchedule;;popup_drag2;;EditSched;;"+ String(array_msg_id[3]) +";;view", "popup_drag", "popup_exit", "screen-center", 0, 0)}; 
     }; 
})(i); 

    closures[i](); 
} 

Merci à Steve Harrison réponse. J'ai eu une idée pour l'emballer

+0

Pour cela, je donne des votes de commentaire pour Steve Harrison – Treby

+0

Si la question est répondue, marquez-le comme tel. Une note sur le code: il n'y a probablement pas de raison de sauvegarder des références à chaque fermeture. Voir ma réponse pour une version révisée de ce que vous avez. –

+0

Ce n'est pas une solution. –

Questions connexes