11528 sujets
JavaScript, DOM et API Web HTML5
C'est tout à fait normal puisque l'alert met en pause l'exécution du script et permet au document DOM d'être prêt, donc sans alert c'est undefined.
Ce qui veut dire que ton code est executé avant que le DOM soit prêt. Si tu boss avec un framework, renseigne toi pour connaitre sa méthode "document ready" ($() pour jQuery par exemple), sinon, ajoute un eventListener à l'événement load, ou si t'as la flemme, définie la fonction window.onload et mets tout dedans...
Ce qui veut dire que ton code est executé avant que le DOM soit prêt. Si tu boss avec un framework, renseigne toi pour connaitre sa méthode "document ready" ($() pour jQuery par exemple), sinon, ajoute un eventListener à l'événement load, ou si t'as la flemme, définie la fonction window.onload et mets tout dedans...
beegees a écrit :Tu aurais mieux fait de l'envoyer à Ze Nenex qui m'a l'air bien plus calé que moi en JS !
je t'ai envoyé un MP
Quoi qu'il en soit (et en ayant le code sous les yeux) il me semble bien que le problème vient de ce que ta fonction occupe() n'attend qu'1 argument (libre_ou_occupe) alors que dans le code html tu essaies d'en passer 2 : occupe(global_id_jour,'occupe') dont notre fameux global_id_jour.
Sinon, puisque tu n'utilises pas window.onload tu ferais sans doute mieux de charger ton JavaScript à la fin de ton code HTML... et mieux encore tu devrais essayer de factoriser tout ton code qui n'en serait que plus lisible (par exemple au lieu d'avoir un onmousedown dans chaque élément TD utiliser addEvent).
Autresinon pourquoi est-ce qu'à la fin de ton code il y a la ligne
<script type="text/javascript">var global_id_jour= null;</script>
?Edit: Je n'avais pas fait attention mais je vois que le tableau est généré en Ajax (ce qui semble bien confirmer l'hypothèse de Ze Nenex). Question : quel est l'intérêt ? Pourquoi ne pas utiliser un formulaire classique pour choisir le mois et l'année et ne faire que du PHP ?
Modifié par Heyoan (07 Aug 2009 - 22:27)
Ze Nenex a écrit :
C'est tout à fait normal puisque l'alert met en pause l'exécution du script et permet au document DOM d'être prêt, donc sans alert c'est undefined.
Ce qui veut dire que ton code est executé avant que le DOM soit prêt. Si tu boss avec un framework, renseigne toi pour connaitre sa méthode "document ready" ($() pour jQuery par exemple), sinon, ajoute un eventListener à l'événement load, ou si t'as la flemme, définie la fonction window.onload et mets tout dedans...
Salut Ze nenex,
Une bonne nuit de repos sans penser à javascript, AJAX, PHP.... ça fait du bien.
Ta réponse m'apprend beaucoup de choses, merci.
Je ne travaille avec aucune framework, je fais de l'AJAX pure et dure.
eventListener c'est avec jquery ? après une recherche sur google, je ne trouve des infos que sur Flex.
Tout mettre dans le body onload alors ?
Encore merci pour ton aide.
beegees
Heyoan a écrit :
Tu aurais mieux fait de l'envoyer à Ze Nenex qui m'a l'air bien plus calé que moi en JS !
Salut Yoan,
Merci pour ta réponse.
[quote=Heyoan]Quoi qu'il en soit (et en ayant le code sous les yeux) il me semble bien que le problème vient de ce que ta fonction occupe() n'attend qu'1 argument (libre_ou_occupe) alors que dans le code html tu essaies d'en passer 2 : occupe(global_id_jour,'occupe') dont notre fameux global_id_jour.
En fait, j'ai du code pour la première semaine du mois, pour la dernière semaine du mois et pour les semaines du mois qui sont entre la première et entre la dernière.
J'ai donc trois fois du code.
J'ai adapté le code une seule fois (donc un seul paramètre envoyé à occupe.js) afin de tester et de ne pas changer pour rien trop de chose.
Je vais maintenant retirer un paramètre pour la première et dernière semaine.
Heyoan a écrit :
Sinon, puisque tu n'utilises pas window.onload tu ferais sans doute mieux de charger ton JavaScript à la fin de ton code HTML...
C'est une bonne idée, je ne pensais pas que l'on pouvait le faire
Heyoan a écrit :
et mieux encore tu devrais essayer de factoriser tout ton code qui n'en serait que plus lisible (par exemple au lieu d'avoir un onmousedown dans chaque élément TD utiliser addEvent).
J'apprends à créer des sites et cette remarque est très importante pour moi, merci Yohan.
Heyoan a écrit :
Edit: Je n'avais pas fait attention mais je vois que le tableau est généré en Ajax (ce qui semble bien confirmer l'hypothèse de Ze Nenex). Question : quel est l'intérêt ? Pourquoi ne pas utiliser un formulaire classique pour choisir le mois et l'année et ne faire que du PHP ?
Je trouve que c'est plus prof en AJAX.
Ma seule erreur est d'avoir conçu un site web 100% fonctionnel pour firefox sans à chaque avancée avoir contrôlé avec internet Explorer.
Encore un grand merci à vous tous pour tout.
beegees
beegees a écrit :Oui mais bon : Ajax ne devrait servir qu'à l'interactivité. S'il s'agit de charger toute une page il est non seulement inutile (si ce n'est pour éviter les quelques millisecondes durant lesquelles la page va disparaître) mais en plus cela t'oblige à surcharger le code pour justement gérer le fait qu'il faut alors attendre que le DOM soit complètement créé et que tes variables soient accessibles. En clair tu te fais plaisir mais ton visiteur s'en contrefiche !
Je trouve que c'est plus prof en AJAX.
Je ne parle même pas de l'accessibilité qui dans ton cas ne semble pas être primordiale puisque ton document s'apparente plutôt à une application web mais dans d'autres situations ce serait vraiment un gros problème.
Sinon, et ça n'engage que moi, je trouve qu'une bibliothèque comme jQuery simplifie grandement l'utilisation d'Ajax et rend le code beaucoup plus clair : je t'invite à essayer.
Modifié par Heyoan (08 Aug 2009 - 10:51)
Serais-tu en train de dire que tu ne connais pas encore la Recherche de la section Apprendre ?
Cela dit les tutos concernant jQuery ne parlent pas d'Ajax mais ce n'est pas bien dur d'en trouver une foultitude sur le Web.
Modifié par Heyoan (08 Aug 2009 - 12:02)
Cela dit les tutos concernant jQuery ne parlent pas d'Ajax mais ce n'est pas bien dur d'en trouver une foultitude sur le Web.
Modifié par Heyoan (08 Aug 2009 - 12:02)
beegees a écrit :
Salut Ze nenex,
Une bonne nuit de repos sans penser à javascript, AJAX, PHP.... ça fait du bien.
Ta réponse m'apprend beaucoup de choses, merci.
Je ne travaille avec aucune framework, je fais de l'AJAX pure et dure.
eventListener c'est avec jquery ? après une recherche sur google, je ne trouve des infos que sur Flex.
Tout mettre dans le body onload alors ?
Encore merci pour ton aide.
beegees
Bosser sans framework n'est pas une tâche facile quand il s'agit d'approcher les event ou de manipuler du DOM, ça devient très vite verbeux et ch***. Déjà, et Heyoan te l'a bien dit, factorise tout ça. Exemple: des fonctions bId, bTN qui évitent les document.getElementByblablabla à rallonge, ainsi que les façades addEvent, removeEvent ou XHR sont basiques mais indispensables pour une compatibilités minimales des navigateurs.
Ensuite, je n'ai pas tout ton code sous les yeux, mais quand il s'agit d'attaquer du DOM, le strict minimum est d'attendre que ce dernier soit prêt. L'ultra basique et l'archi-pas-recommandé est de passer par la propriété (fonction) window.onload. Dans le même domaine de "craditude", tu peux mettre ton script tout en bas de la balise body... Mais le mieux pour commencer est de se servir d'une façade genre "addEvent" (google est ton ami) pour attribuer un "handler" (une fonction) à l'événement load: addEvent(window, "load", myFunction);
Dernière chose. Oublie les variables globales et pense plutôt à un namespace. En plus, en JS ce n'est pas bien compliqué, tu mets tout dans un objet :
myNS = {
init: function(e) {
},
ID_JOUR: null
// ...
};
addEvent(window, "load", myNS.init);
De cette façon tu évites de polluer l'espace globale et tu permets à d'éventuels autres namespace de cohabiter / discuter entre eux. En ayant tout ça, crois-moi, ton problème serait réglé.Pour répondre à ta question, eventListener n'est pas du jQuery. Il s'agit plutôt des méthodes DOM addEventListener et removeEventListener, non compatible IE, d'où l'intérêt de les encapsuler dans une méthode dite "façade" qui se chargera du bon comportement (IE = attachEvent et pas de phase de capturing). Tu en trouveras pleins sur le net.
*Reprend son soufle*
Bon courage
Heyoan a écrit :
Serais-tu en train de dire que tu ne connais pas encore la Recherche de la section Apprendre ?
Cela dit les tutos concernant jQuery ne parlent pas d'Ajax mais ce n'est pas bien dur d'en trouver une foultitude sur le Web.
Ma question ne servait à rien, je connais la fonction de recherche, j'avais trouvé l'article sur le jquery.
Je réponds à Ze maintenant.
Merci pour tout.
beegees
*Reprend son soufle*
Bon courage
Re,
Un tout grand merci pour ta réponse qui me met sur plusieurs pistes.
Je suis d'accord mais ça permet de bien comprendre le fonctionnement d'AJAX (je pense)
Factoriser c'est donc "créer un raccourci" ?
Si tu le souhaite, je peux aussi te passer les identifiants et l'adresse du site.
Je vais commencer par ça je pense, je vais faire une recherche sur goolge.
Je suis très intéressé par cette information, le namespace (espace de noms) permet donc de créer une zone mémoire avec des variables qui sont regroupés par utilité et disponible partout dans le site ? si c'est ça, ça m'intéresse beaucoup.
Merci pour l'info, le DOM me semble très vaste et assez compliqué à manipuler...
Un super grand merci pour avoir répondu en détail à mon problème.
Tu es vraiment gentil, patient et efficace.
beegees
Bon courage
Re,
Un tout grand merci pour ta réponse qui me met sur plusieurs pistes.
Ze Nenex a écrit :
Bosser sans framework n'est pas une tâche facile quand il s'agit d'approcher les event ou de manipuler du DOM, ça devient très vite verbeux et ch***.
Je suis d'accord mais ça permet de bien comprendre le fonctionnement d'AJAX (je pense)
Ze Nenex a écrit :
Déjà, et Heyoan te l'a bien dit, factorise tout ça. Exemple: des fonctions bId, bTN qui évitent les document.getElementByblablabla à rallonge, ainsi que les façades addEvent, removeEvent ou XHR sont basiques mais indispensables pour une compatibilités minimales des navigateurs.
Factoriser c'est donc "créer un raccourci" ?
Ze Nenex a écrit :
Ensuite, je n'ai pas tout ton code sous les yeux, mais quand il s'agit d'attaquer du DOM, le strict minimum est d'attendre que ce dernier soit prêt.
Si tu le souhaite, je peux aussi te passer les identifiants et l'adresse du site.
Ze Nenex a écrit :
L'ultra basique et l'archi-pas-recommandé est de passer par la propriété (fonction) window.onload. Dans le même domaine de "craditude", tu peux mettre ton script tout en bas de la balise body...
Ze Nenex a écrit :
Vu que tu me déconseilles ces pratiques, je ne vais pas le faire, je vais commencer à procéder d'une façon correcte.
Ze Nenex a écrit :
Mais le mieux pour commencer est de se servir d'une façade genre "addEvent" (google est ton ami) pour attribuer un "handler" (une fonction) à l'événement load: addEvent(window, "load", myFunction);
Je vais commencer par ça je pense, je vais faire une recherche sur goolge.
Ze Nenex a écrit :
Dernière chose. Oublie les variables globales et pense plutôt à un namespace. En plus, en JS ce n'est pas bien compliqué, tu mets tout dans un objet :
De cette façon tu évites de polluer l'espace globale et tu permets à d'éventuels autres namespace de cohabiter / discuter entre eux. En ayant tout ça, crois-moi, ton problème serait réglé.myNS = { init: function(e) { }, ID_JOUR: null // ... }; addEvent(window, "load", myNS.init);
Je suis très intéressé par cette information, le namespace (espace de noms) permet donc de créer une zone mémoire avec des variables qui sont regroupés par utilité et disponible partout dans le site ? si c'est ça, ça m'intéresse beaucoup.
Ze Nenex a écrit :
Pour répondre à ta question, eventListener n'est pas du jQuery. Il s'agit plutôt des méthodes DOM addEventListener et removeEventListener, non compatible IE, d'où l'intérêt de les encapsuler dans une méthode dite "façade" qui se chargera du bon comportement (IE = attachEvent et pas de phase de capturing). Tu en trouveras pleins sur le net.
Merci pour l'info, le DOM me semble très vaste et assez compliqué à manipuler...
Un super grand merci pour avoir répondu en détail à mon problème.
Tu es vraiment gentil, patient et efficace.
beegees
beegees a écrit :voir Factorisation (Wikipedia).
Factoriser c'est donc "créer un raccourci" ?
Sinon je te redonne le lien vers le tuto de koala64 : Comment bien coder en Javascript (à lire d'urgence ).
Modifié par Heyoan (08 Aug 2009 - 14:35)
beegees a écrit :
Je suis très intéressé par cette information, le namespace (espace de noms) permet donc de créer une zone mémoire avec des variables qui sont regroupés par utilité et disponible partout dans le site ? si c'est ça, ça m'intéresse beaucoup.
L'utilité d'un namespace en programmation vient surtout de l'ambiguïté que peut produire deux fonctions / opérateurs / variables ayant le même nom. com.software.doSomething fera autre chose que net.software.doSomething et seront bien distincts.
Certains langages comme Java (packages) ou Python (modules) proposent cette fonctionnalité en natif. En Javascript, l'interprétation qu'on en fait résulte généralement en l'utilisation d'objets directement affectés à l'espace globale (objet window pour un navigateur), comme illustré dans mon précédent message.
Certains framework Javascript le font et c'est le cas de jQuery qui par ailleurs devient de plus en plus LE framework. Mais ne te lance pas trop vite dedans, car tu l'as bien souligné, il faut avant tout connaitre les bases du langage.
beegees a écrit :
Factoriser c'est donc "créer un raccourci" ?
C'est un aspect qu'on nomme "alias". Mais ce n'est pas le seul loin de là. Une factorisation poussée passe par l'utilisation de design pattern (toute une histoire...). Façade en est un et te fourni un comportement abstrait simplifié quelque soit la complexité pour l'obtenir.
Par exemple, jQuery utilise ce pattern à profusion afin de produire des fonctions cross-browser. Je te parlais d'XHR (ou XMLHttpRequest). C'est en général le nom qu'on donne à cette méthode façade pour produire un objet "requête" au comportement identique quelque soit le navigateur. Pareil pour addEvent / removeEvent.
Design pattern Façade
Re,
Merci pour tes explications.
J'ai donc compris le principe de espace de noms.
Maintenant, j'ai suivis ton conseil, j'utilise un addEvent comme ceci :
Je déclare donc le code ci-dessus dans la page principale.
Dans la même page, j'ai mis ceci juste en dessous du body :
donc sur l'évènement onload, j'appelle la fonction "occupe".
On ne peut pas passer d'argument ? la fonction "occupe" prend un argument.
Je ne sais pas si c'est à cet endroit là que je dois mettre cette ligne de code ?
La fonction "occupe" devrait être appelée au moment où je clique sur un div :
Merci d'avance pour votre aide.
beegees
Merci pour tes explications.
J'ai donc compris le principe de espace de noms.
Maintenant, j'ai suivis ton conseil, j'utilise un addEvent comme ceci :
<script type="text/javascript">
function addEvent(obj, event, fct)
{
if (obj.attachEvent) //Est-ce IE ?
obj.attachEvent("on" + event, fct); //Ne pas oublier le "on"
else
obj.addEventListener(event, fct, true);
}
</script>
Je déclare donc le code ci-dessus dans la page principale.
Dans la même page, j'ai mis ceci juste en dessous du body :
<script type="text/javascript">addEvent(window , "load", occupe);</script>
donc sur l'évènement onload, j'appelle la fonction "occupe".
On ne peut pas passer d'argument ? la fonction "occupe" prend un argument.
Je ne sais pas si c'est à cet endroit là que je dois mettre cette ligne de code ?
La fonction "occupe" devrait être appelée au moment où je clique sur un div :
<div id="menucontextuelProposer_Reservation" class="menucontextuel">
<ul>
<li><em>Demande de réservation</em></li>
<li><a href="javascript:;"onClick="hideMenu(); occupe('proposer'); return false;">Proposer une réservation</a></li>
<li><a href="javascript:;"onClick="hideMenu(); occupe('ESC'); return false;">Annuler</a></li>
</ul>
</div>
Merci d'avance pour votre aide.
beegees
Salut,
<jingle><pub>
Un peu de lecture qui ne tombe pas dans un débat stérile : http://jqueryvsmootools.com/
(non pas pour troller mais pour préciser qu'il ne s'agit qu'une question d'objectifs et de point de vue)
Et puis, un peu de pluralité ne fait pas de mal.
</pub></jingle>
Le troisième paramètre que tu passes à addEventListener est le mode de propagation : capturant ou... "effervescent".
Aussi, attachEvent n'offre pas ce contrôle; IE ne connait pas le mode capturant, d'où le fait qu'on l'évite.
Il serait donc préférable de passer ta variable à "false". (C'est précisé dans le lien que t'a fournit Heyoan)
Par ailleurs, addEventListener est la norme et attachEvent, l'exception. Cela ne porte pas trop à préjudice de le laisser tel quel mais, d'une manière générale, il vaut mieux privilégier la norme PUIS gérer les exceptions en cas de mauvaise interprétation.
<jingle><pub>
Ze Nenex a écrit :euh... Attention ! Tu tires des conclusions hâtives, l'ami !
(...) jQuery qui par ailleurs devient de plus en plus LE framework.
Un peu de lecture qui ne tombe pas dans un débat stérile : http://jqueryvsmootools.com/
(non pas pour troller mais pour préciser qu'il ne s'agit qu'une question d'objectifs et de point de vue)
Et puis, un peu de pluralité ne fait pas de mal.
</pub></jingle>
beegees a écrit :Tel que tu as écrit ta fonction addEvent, les méthodes attachEvent et addEventListener ne fonctionnent pas dans le même mode; tu risques donc d'avoir quelques surprises.
Je déclare donc le code ci-dessus dans la page principale.
Le troisième paramètre que tu passes à addEventListener est le mode de propagation : capturant ou... "effervescent".
Aussi, attachEvent n'offre pas ce contrôle; IE ne connait pas le mode capturant, d'où le fait qu'on l'évite.
Il serait donc préférable de passer ta variable à "false". (C'est précisé dans le lien que t'a fournit Heyoan)
Par ailleurs, addEventListener est la norme et attachEvent, l'exception. Cela ne porte pas trop à préjudice de le laisser tel quel mais, d'une manière générale, il vaut mieux privilégier la norme PUIS gérer les exceptions en cas de mauvaise interprétation.
beegees a écrit :Tu peux même mettre cette instruction dans un fichier externe. Dès lors, tu peux centraliser tous tes scripts dans ce fichier, ce qui facilite la maintenance et tu disposes ainsi, si tu le souhaites, de cette fonction sur chacune de tes pages sans avoir à la redéclarer.
Dans la même page, j'ai mis ceci juste en dessous du body
beegees a écrit :Il est tout à fait possible de passer une fonction en argument de addEvent puis, au sein de celle-ci, exécuter la fonction "occupe" en lui passant un argument.
On ne peut pas passer d'argument ? la fonction "occupe" prend un argument.
Salut Koala,
Merci pour ta réponse très intéressante.
J'ai appliqué les deux changements que tu m'indiques.
Je n'ai pas bien compris pourquoi passer de true à false dans le 3e paramètre mais ce n'est pas très grave pour l'instant, je lirai ton tuto en profondeur quand j'aurai 5 minutes.
Voici donc mon nouveau code :
OK, ça je l'ai fait aussi :
Que veux-tu dire par cette phrase ? :
ça veut dire que je mets toutes les fonctions qui vont appeler addEvent en dessous de la déclaration corrigée ci-dessus ?
Ici, ça se complique pour moi.
J'ai cet élément :
Je voudrais donc que sur les éléments dont l'id (sur le onclick) est "appel_occupe" que :
- on appelle la fonction "occupe"
- qu'on lui passe un paramètre
- qu'on attende que le DOM soit complètement chargé car autrement, la variable n'arrive pas
Je présume que ceci :
ne sera alors plus nécessaire ?
Un super grand merci à toi Koala ainsi qu'à Ze et à Heyoan.
beegees
Merci pour ta réponse très intéressante.
a écrit :
Tel que tu as écrit ta fonction addEvent, les méthodes attachEvent et addEventListener ne fonctionnent pas dans le même mode; tu risques donc d'avoir quelques surprises. cligne
Le troisième paramètre que tu passes à addEventListener est le mode de propagation : capturant ou... "effervescent".
Aussi, attachEvent n'offre pas ce contrôle; IE ne connait pas le mode capturant, d'où le fait qu'on l'évite.
Il serait donc préférable de passer ta variable à "false". (C'est précisé dans le lien que t'a fournit Heyoan)
Par ailleurs, addEventListener est la norme et attachEvent, l'exception. Cela ne porte pas trop à préjudice de le laisser tel quel mais, d'une manière générale, il vaut mieux privilégier la norme PUIS gérer les exceptions en cas de mauvaise interprétation.
J'ai appliqué les deux changements que tu m'indiques.
Je n'ai pas bien compris pourquoi passer de true à false dans le 3e paramètre mais ce n'est pas très grave pour l'instant, je lirai ton tuto en profondeur quand j'aurai 5 minutes.
Voici donc mon nouveau code :
<script type="text/javascript">
function addEvent(obj, event, fct)
{
if (obj.addEventListener) //Est-ce Firefox de Mozilla ?
obj.addEventListener(event, fct, false);
else
obj.attachEvent("on" + event, fct); //Ne pas oublier le "on"
}
</script>
a écrit :
Tu peux même mettre cette instruction dans un fichier externe. Dès lors, tu peux centraliser tous tes scripts dans ce fichier, ce qui facilite la maintenance et tu disposes ainsi, si tu le souhaites, de cette fonction sur chacune de tes pages sans avoir à la redéclarer.
OK, ça je l'ai fait aussi :
<script type="text/javascript" src="Fonctions/addEvent.js"></script>
Que veux-tu dire par cette phrase ? :
a écrit :
Dès lors, tu peux centraliser tous tes scripts dans ce fichier
ça veut dire que je mets toutes les fonctions qui vont appeler addEvent en dessous de la déclaration corrigée ci-dessus ?
a écrit :
Il est tout à fait possible de passer une fonction en argument de addEvent puis, au sein de celle-ci, exécuter la fonction "occupe" en lui passant un argument.
Ici, ça se complique pour moi.
J'ai cet élément :
<li id="appel_occupe"><a href="javascript:;"onClick="hideMenu(); occupe('proposer'); return false;">Proposer une réservation</a></li>
Je voudrais donc que sur les éléments dont l'id (sur le onclick) est "appel_occupe" que :
- on appelle la fonction "occupe"
- qu'on lui passe un paramètre
- qu'on attende que le DOM soit complètement chargé car autrement, la variable n'arrive pas
Je présume que ceci :
<a href="javascript:;"onClick="hideMenu(); occupe('proposer'); return false;">Proposer une réservation</a>
ne sera alors plus nécessaire ?
Un super grand merci à toi Koala ainsi qu'à Ze et à Heyoan.
beegees
Heyoan a écrit :
voir Factorisation (Wikipedia).
Sinon je te redonne le lien vers le tuto de koala64 : Comment bien coder en Javascript (à lire d'urgence ).
Re,
On m'a dit que IE ne recevait pas les paramètres sur un évènement.
J'ai testé, et j'ai remarqué en effet que mes paramètres n'étaient pas arrivés dans la fonction avec IE :
alert("param 1" + e);
alert("param 2" + pIdMenu);
alert("param 3" + id_jour);
alert("param 4" + user);
Résultat :
a écrit :
param 1 [objectEvent]
param 2
param 3 undefined
param 4 undefined
Qu'en penses-tu ?
Merci.
beegees
En repassant par là je me rends compte que je n'avais pas cité le tuto de Julien qui pourrait t'être d'une aide précieuse : La gestion des événements en JavaScript (en même temps tu aurais pu chercher toi-même ! )
Par rapport à ta problématique, il me semble (je n'ai malheureusement gardé ni ton code ni ton MP ) que le code suivant pourrait t'aider :
Edit: code modifié pour la compatibilité avec Opera (à noter que sur ce navigateur la détection du clic droit est désactivée par défaut).
Modifié par Heyoan (09 Aug 2009 - 16:55)
Par rapport à ta problématique, il me semble (je n'ai malheureusement gardé ni ton code ni ton MP ) que le code suivant pourrait t'aider :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>
<style type="text/css">
td {
border: 1px solid blue;
}
</style>
<script type="text/javascript">
<!--
// fonction addEvent (http://www.scottandrew.com/weblog/jsjunk)
function addEvent(oElem, sEvType, fn, bCapture)
{
return oElem.addEventListener?
oElem.addEventListener(sEvType, fn, bCapture):
oElem.attachEvent?
oElem.attachEvent('on' + sEvType, fn):
oElem['on' + sEvType] = fn;
}
// fonction test
var oTest =
{
// Initialisation des évènements sur les TD
_Init: function()
{
// Récupération de tous les TD de la table
var lTDs = document.getElementById('maTable').getElementsByTagName('td');
if(!lTDs) return;
for(var iI = 0; iI < lTDs.length; ++iI){ // Pour chaque TD...
var eTD = lTDs[iI];
// addEventListener
addEvent(eTD, 'contextmenu', oTest._ReturnFalse, false);
addEvent(eTD, 'mousedown', oTest._ClickDroit, false);
}
},
// On désactive contextmenu sur les TD pour éviter les conflits avec ClickDroit
_ReturnFalse: function(event)
{
if (event.preventDefault) {
event.preventDefault();
}
event.returnValue = false;
},
// Affichage Clic Droit
_ClickDroit: function(event)
{
var oElem = event.target || window.event.srcElement;
if(event.button==2) {
alert("Vous avez fait un clic droit sur " + oElem.id);
} else {
alert("Vous n'avez pas fait un clic droit sur " + oElem.id);
}
}
};
if(document.getElementById && document.getElementsByTagName) addEvent(window, 'load', oTest._Init, false);
-->
</script>
</head>
<body>
<table id="maTable">
<tr>
<td id="td1_1">Bla Bla 1_1</td>
<td id="td1_2">Bla Bla 1_2</td>
<td id="td1_3">Bla Bla 1_3</td>
</tr>
<tr>
<td id="td2_1">Bla Bla 2_1</td>
<td id="td2_2">Bla Bla 2_2</td>
<td id="td2_3">Bla Bla 2_3</td>
</tr>
</table>
</body>
</html>
Edit: code modifié pour la compatibilité avec Opera (à noter que sur ce navigateur la détection du clic droit est désactivée par défaut).
Modifié par Heyoan (09 Aug 2009 - 16:55)
Bonjour Heyon,
Merci pour ton aide très appréciée.
J'avais vu cet article hier, je vais le relire attentivement.
J'ai ajouté ton code comme ceci :
ça ne fonctionne pas, j'ai pourtant mis l'ID de mon tableau
Qu'en penses-tu ?
Encore merci pour tout.
beegees
Merci pour ton aide très appréciée.
J'avais vu cet article hier, je vais le relire attentivement.
J'ai ajouté ton code comme ceci :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>
<style type="text/css">
td {
border: 1px solid blue;
}
</style>
<script type="text/javascript">
// fonction addEvent (http://www.scottandrew.com/weblog/jsjunk)
//fonction générique pour IE et pour FF
function addEvent(oElem, sEvType, fn, bCapture)
{
return oElem.addEventListener?
oElem.addEventListener(sEvType, fn, bCapture):
oElem.attachEvent?
oElem.attachEvent('on' + sEvType, fn):
oElem['on' + sEvType] = fn;
}
// fonction test
var oTest =
{
// Initialisation des évènements sur les TD
_Init: function()
{
// Récupération de tous les TD de la table
var lTDs = document.getElementById('maTable').getElementsByTagName('td');
if(!lTDs) return;
for(var iI = 0; iI < lTDs.length; ++iI){ // Pour chaque TD...
var eTD = lTDs[iI];
// addEventListener
addEvent(eTD, 'click', oTest._ClickGauche, false);
addEvent(eTD, 'contextmenu', oTest._ClickDroit, false);
}
},
// Affichage Clic Gauche
_ClickGauche: function(event)
{
var oElem = event.target || window.event.srcElement;
alert("Clic Gauche sur " + oElem.id);
},
// Affichage Clic Droit
_ClickDroit: function(event)
{
var oElem = event.target || window.event.srcElement;
alert("Clic Droit sur " + oElem.id);
if (event.preventDefault) {
event.preventDefault();
}
event.returnValue = false;
}
};
if(document.getElementById && document.getElementsByTagName) addEvent(window, 'load', oTest._Init, false);
</script>
</head>
<body>
<table id="maTable">
<tr>
<td id="td1_1">Bla Bla 1_1</td>
<td id="td1_2">Bla Bla 1_2</td>
<td id="td1_3">Bla Bla 1_3</td>
</tr>
<tr>
<td id="td2_1">Bla Bla 2_1</td>
<td id="td2_2">Bla Bla 2_2</td>
<td id="td2_3">Bla Bla 2_3</td>
</tr>
</table>
</body>
</html>
ça ne fonctionne pas, j'ai pourtant mis l'ID de mon tableau
Qu'en penses-tu ?
Encore merci pour tout.
beegees