Bonjour,
Objectif: Je voudrais remplacer la fonction de callback (VALIDER) d'un event "click" par une autre (GO BACK) sur un même élément <td> avec le même event "click". Seulement ds le contexte Moz & Co (la comptabilité IE viendra plus tard, un jour)
Problème: je n'arrive pas à tuer le premier event, donc le click sur <td> provoque exécution des 2 fonctions de callback.
Je sais, ça a vraiment l'air du truc le plus débile de la terre, mais je n'y arrive pas. Donc le problème est surement entre le clavier et la bécane
Après de nombreuses et vaines tentatives, il semblerait que la seconde fonction soit bien implémentée mais que le premier event listener soit toujours en vie (et je n'arrive pas à le tuer). Donc ça ne donne pas le résultat attendu... double affichage de tables etc... puis des erreurs js en conséquence.
Quelques unes des recherches en ts genres:
J'ai bien lu ces forums, tutos articles, et bien sûr tenté un certain nombre de ces méthodes pour tuer le de premier event mais sans succès.
le meilleur sur le sujet à mon avis
Un post de 2005...
quirks
Le tuto auto-completion (pour l'inspiration)
Le schéma:
Je vais essayer de schématiser avant de balancer des paquets de mon code indigeste :
Le code:1) J'affiche une table <table> de 2 colonnes avec un pied de table <tfoot>.
2) J'attache un event "click" sur une des cellules de <tr>
3) Le click déclenche une requête ajax avec une fonction de callback F1
4) Avec F1, quand le retour xhrResponseText est Ok, je change le pied de table pour lui affecter (en tous cas essayer) l'autre fonction de callback F2.
5) La (tentative de) suppression des events créés précédemment, cette fonction est appelée depuis F1
6) La fonction F2 qui assure le "go back" vers un tableau de synthèse, est en fait l'émettrice d'une autre requête Ajax.
1) La Table (j'ai mis tt le code mais ça se passe au point 8), à la fin):
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168 function createTable(id_insert_point, table_title, data_title, data_array, with_pic, with_tfoot , input_on_off, callback_on_submit){ // 1) Creation du noeud <tbody> var tbody = document.createElement("tbody"); var nbrows = data_array.length ; var nbcols = data_array[0].length; var count_col = 0; // 2) Remplissage de <tbody> for(var i = 0; i < nbrows; i++){ // Création Nouvelle ligne var tr = document.createElement("tr"); // Bouclage sur les colonnes de data_array for (var j = 0; j < nbcols; j++){ // Creation Nouvelle cellule var td = document.createElement("td"); var td_text = false ; // Contenu <text> (1ere colonne, et suivantes si input_on_off = false) if (input_on_off == false) { // Affichage quand j=0 ou j est impair if (j == 0 || j.isMultipleOf(2) == false) { td_text = (undefined != data_array[i][j]) ? data_array[i][j] : '-' ; td_text = document.createTextNode(td_text); } // Cas des IMAGES if (with_pic && i==0 && j==1) { var path_pic = 'images/'; //var source = (undefined != data_array['picture']) ? path_pic+data_array['picture'] : '#' ; var source = (undefined != data_array[i][j]) ? path_pic+data_array[i][j] : '#' ; td_text = document.createElement("img"); var regex = /jpg|png|gif/ ; if (regex.test(source) == true) td_text.setAttribute("src", source); else td_text.setAttribute("src", ""); var new_dim = redimImage(source , 35, 35) ; td_text.setAttribute("width", new_dim['width']); td_text.setAttribute("height", new_dim['height']); td_text.setAttribute("alt", 'no picture available'); } } // Contenu <input> if (input_on_off) { // 1ere colonne j=0 if ( j == 0) { td_text = (undefined != data_array[i][j]) ? data_array[i][j] : '-' ; td_text = document.createTextNode(td_text); } // Colonnes suivantes ssi j impair if (j.isMultipleOf(2) == false ) { // Contenu Balise <input> //var test = '(' + i + ', ' + j +')' ; var title = (undefined != data_array[i][0]) ? data_array[i][0] : '-' ; var value = (undefined != data_array[i][j]) ? data_array[i][j] : '-' ; var id_input= (undefined != data_array[i][j+1]) ? data_array[i][j+1] : '-' ; // Creation Balise <input> td_text = document.createElement("input"); td_text.setAttribute("id", id_input); td_text.setAttribute("title", title); td_text.setAttribute("value", value); } } // Ajout de la cellule <td> à la ligne <tr> en cours if (td_text) { td.appendChild(td_text); tr.appendChild(td); } } // Ajout de la ligne au tableau <tbody> tbody.appendChild(tr); } // 3) thead, tfoot: Creation thead et tfoot par clonage // thead var trTitle = document.createElement("tr"); var thead = document.createElement("thead"); // Nbre effectif de colonnes affichées var row = tbody.getElementsByTagName("tr"); // NOTA: compatible IE (c'est getElementsByName qui ne l'est pas) var firstrow = row.item(0) ; var effective_cols = firstrow.children.length; // NOTA: FF 3.5 only for (var j = 0; j < effective_cols ; j++){ var th = document.createElement("th"); var title = (undefined != data_title[j])? data_title[j] : "-" ; th.appendChild(document.createTextNode(title)); trTitle.appendChild(th); } thead.appendChild(trTitle.cloneNode(true)); // tfoot if (with_tfoot) { var tfoot = document.createElement("tfoot"); tfoot.appendChild(trTitle.cloneNode(true)); var node_tr = tfoot.firstChild ; // tr var nodes_th = node_tr.childNodes ; // th for (var j=0, c=nodes_th.length; j<c; j++) nodes_th.item(j).setAttribute("id",'colonne_'+j) ; //if (input_on_off) nodes_th.item(j).setAttribute("value", "VALIDER" ) ; } // 4) caption: Creation Titre du tableau var caption = document.createElement("caption"); var caption_text = table_title; caption_text = document.createTextNode(caption_text); caption.appendChild(caption_text); // 5) <table> Mise En Oeuvre du tableau var table = document.createElement("table"); table.appendChild(caption); table.appendChild(thead); if (with_tfoot) table.appendChild(tfoot); table.appendChild(tbody); // 6) Ajout du tableau au point d'insertion "id_insert_point" document.getElementById(id_insert_point).appendChild(table); // 7) Style des cellules for (i=0; i<row.length; i++) { var cell = row[i].lastElementChild; if (cell.innerHTML == "" || cell.innerHTML.match(/none.+?/) || cell.id.match(/none/) ) { row[i].style.backgroundColor='blue'; row[i].firstChild.style.color='white'; row[i].lastChild.innerHTML = ''; } // Cells with pic else if (cell.lastChild.nodeName == 'IMG') { row[i].style.backgroundColor='white'; row[i].style.color='black'; } // Other Cells (without pics) else { row[i].style.backgroundColor='gray'; row[i].firstChild.style.color='black'; with (row[i].firstChild.nextSibling) { style.fontWeight='bold'; style.fontSize='small'; if (undefined != nextSibling) nextSibling.style.fontWeight='bold'; if (undefined != nextSibling) nextSibling.style.fontSize='small'; } } } // 8) BOUTON SUBMIT ou GOBACK(tfoot) if (with_tfoot && input_on_off) { addButton("tfoot", "VALIDER", callback_on_submit); } // Bouton de retour à la matrice else if (with_tfoot && !input_on_off) { // redondance de cond° addButton("tfoot", "RETOUR", go_back ); } }
2) La fonction d'attachement de l'event
3) Requête Ajax, première fonction de callback de la table
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 function addButton(tag, text, callback) { // FF only // Récuperer le tag var tfoot_tr = document.getElementsByTagName(tag).item(0).firstChild; var tfoot_th = tfoot_tr.children; // FF only (permet de ne pas prendre en compte les noeuds texte) // Implanter texte et event pour chaque noeud tfoot des colonnes <input> (j>0) for (var j=1, c=tfoot_th.length ; j < c ; j++ ) { var current_item = tfoot_th.item(j) ; // Texte VALIDER ou GOBACK var text_node = current_item.firstChild ; text_node.nodeValue = text ; // Event 'onmouseover' if (document.all) current_item.attachEvent("onmouseover", OnChangeColor); // IE else current_item.addEventListener("mouseover", OnChangeColor, true); // Moz&Co // Event 'onmouseout' if(document.all) current_item.attachEvent("onmouseout", OffChangeColor); // IE else current_item.addEventListener("mouseout", OffChangeColor, true); // Moz&Co // Event 'on click' (bouton VALIDER ou GOBACK) if ( undefined != callback || false != callback) { if (document.all) current_item.attachEvent("onclick", callback); // IE else current_item.addEventListener("click", callback, true); // Moz&Co } } return true; }
4) Le callback de la requête Ajax (que j'ai appelée "F1")
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 function update(event) { // Callback de <table> // test arret propagation : ne change rien avec ou sans event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); // Recup des valeurs des inputs entrées dans la table var specs = GetMyInputs('input', /none.+/) ; // Recuperation de la reference active (3eme <Select>) var selectList = document.getElementsByTagName("select"); var ThirdSelect = selectList.item(2) ; var product_ref = ThirdSelect.value; // Xhr des New datas (encodage et filtre réalisés intégralement sous PHP) var parameters = Serialize(specs) + '&product_ref=' + product_ref + '&update=true' ; var xhr_file = "spec/local/xhr_create_new_spec.php"; //alert('UPDATE SPECS:\nParam sérialisés à envoyer :\n' + parameters) ; request(FirstSelect, xhrReturn, xhr_file, parameters) ; return true; }
5) La (tentative de) suppression des event précédents
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 function xhrReturn(oText, balise_active) { // 4eme fonction de callback de request ajax // Virer les espaces ajoutés par le serveur par magie oText = oText.replace(/\s/g, ''); if (oText == "Ok") { removeEvt("tfoot"); alert('Ok: dB altered properly'); addButton("tfoot", "RETOUR", go_back ); return true; } else { alert('Fail: NOT added to dB' + '\nDEBUG:\n' + oText); return false; } }
Nota: j'ai essayé aussi les méthodes du post de 2005, mais pas de changement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 function removeEvt(tag) { // test FF only // alert('suppr evt precedents'); var tfoot_tr = document.getElementsByTagName(tag).item(0).firstChild; var tfoot_th = tfoot_tr.children; for (var j=0, c=tfoot_th.length ; j < c ; j++ ) { var current_el = tfoot_th.item(j) ; current_el.onclick = null; } }
6) La fonction F2 "go_back" appelée au point 4)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 function go_back(event) { // Stop propag: ça sert à rien après les tests "avec ou sans" event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); var oSelect = document.getElementsByTagName("select").item(2) ; request(oSelect, checkData, 'spec/local/xhr_check_data_xml.php', false); }
Partager