Partage
  • Partager sur Facebook
  • Partager sur Twitter

FOIRE AUX QUESTIONS - ANNEXE

Contribuez

    23 mars 2010 à 11:40:04

    Bon bah c'est fait... Je vous préviens, si c'était pas là qu'il fallait faire la demande, je rejette entièrement la faute sur vous :-°
    • Partager sur Facebook
    • Partager sur Twitter
      23 mars 2010 à 11:51:17

      Bah, ça n'empêche pas que tu as initialisé, donc c'est toi le fauteur de troubles... :lol:
      • Partager sur Facebook
      • Partager sur Twitter
        6 avril 2010 à 9:22:26

        Tu as eu une réponse Gol' ? :D
        • Partager sur Facebook
        • Partager sur Twitter
          6 avril 2010 à 14:40:27

          Ah bah oui, y'a L·P qui m'a écrit à ce sujet...

          Mais j'ai plus de nouvelles là. Je crois/j'espère qu'il a poster un truc dans le forum privé de l'équipe du SdZ.

          Je le relance demain si pas de nouvelles ;)
          • Partager sur Facebook
          • Partager sur Twitter
            9 novembre 2010 à 19:37:04

            Bonsoir,
            Je parcourais la FAQ et je suis tombé sur ce code :


            function addEvent(obj_, event_, fct_) {
                if(obj_.addEventListener) {
                    obj_.addEventListener(event_, fct_, true);	
                }
                else if(obj_.attachEvent) {
                    if(/this\./g.test(fct_.valueOf())){
                        obj_['on' + event_] = fct_;
                    }
                    else {
                        obj_.attachEvent('on' + event_, fct_);
                    }
                }
            }
            


            Et je le trouve vraiment pas beau :-° . Donc je voulais proposer ce code qui permet d'utiliser this et return false; (à la place de event.prenventDefault() & returnValue) :


            function addEvent(obj,sEvent,fct){
            	var listener;
            	if(obj.addEventListener){
            		listener = function(e){
            			if(fct.call(obj,e)===false){
            				e.preventDefault();
            			}
            		};
            		obj.addEventListener(sEvent,listener,false);
            	}else{
            		listener = function(){
            			window.event.returnValue = fct.call(obj,window.event);
            		};
            		obj.attachEvent('on'+sEvent,listener);
            	}
            	return listener;
            }
            


            En bonus on récupère le listener pour pouvoir le détacher si besoin.

            Voilà pour ma contribution :D
            • Partager sur Facebook
            • Partager sur Twitter
              9 novembre 2010 à 19:43:47

              Euh... return false n'a pas la même signification que preventDefault hein...
              • Partager sur Facebook
              • Partager sur Twitter
                9 novembre 2010 à 19:49:00

                Hmm... return false; dans un onclick="" ou dans un obj.onclick=function(){} ça reviens au même que preventDefault() avec addEventListener , je me trompe ? C'est histoire d'avoir un comportement identique sous IE et les navigateurs standards...
                • Partager sur Facebook
                • Partager sur Twitter
                  9 novembre 2010 à 19:53:38

                  Tu te trompes, dans le sens où return false stoppe également la propagation de l'événement...

                  Ce que ne fait normalement pas preventDefault() ou returnValue...

                  Stopper la propagation, c'est le rôle de stopPropagation() et cancelBubble...


                  EDIT : Dans ton code, pourquoi tu fais pas simplement un return de l'appel de call dans les fonction listener ? Ca en ferait un vrai return false quoi ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 novembre 2010 à 21:13:38

                    Personnellement je préfère le premier code :-°

                    Surtout que tu exclus les navigateurs qui n'ont ni addEventListener ni attachEvent (Ok les vieux, mais ils existent ,D) Et surtout tu corriges pas le problème du this avec attachEvent.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 novembre 2010 à 21:36:41

                      Bah si il fait le .call avec attachEvent aussi... ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 novembre 2010 à 21:39:08

                        Ok j'ai peu être rien dit :-°
                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 novembre 2010 à 10:10:32

                          Citation : Tiller

                          Surtout que tu exclus les navigateurs qui n'ont ni addEventListener ni attachEvent.

                          Le code de strucky aussi :-° , et franchement osef de IE4 ou Netscape

                          Citation : Tiller

                          Personnellement je préfère le premier code

                          Avoue que ce test est particulièrement laid : if(/this\./g.test(fct_.valueOf())){
                          En plus pourquoi this. ? this n'est pas forcément suivi d'une propriété... et puis au final, on perd tout l'intérêt de addEventListener.


                          Citation : Golmote

                          Tu te trompes, dans le sens où return false stoppe également la propagation de l'événement...

                          Alors, après moult test :
                          obj.onclick = function(){
                          	return false; // Annule l'action par défaut de l’évènement,
                          	// mais ne stoppe pas la propagation
                          	// équivalent à
                          	event.preventDefault(); // sauf qu'aucune valeur n'est retournée et la fonction n'est pas stoppée
                          };
                          


                          Donc je ne me trompais pas (cf. : "return false; dans un onclick="" ou dans un obj.onclick=function(){} ça reviens au même que preventDefault() avec addEventListener")

                          Enfin un return false; dans un listener n'a d'action ni sur la propagation ni sur l'action par défaut, mais ça on le savais déjà.

                          Au final, j'ai recodé ma fonction pour mieux respecter la façon standard de gérer les évènement, ça devrait vous plaire :D . Pour IE j'ai ajouté les méthodes preventDefault() et stopPropagation() ainsi que la propriété target (liste non exhaustive, mais ce sont les principales) :

                          function addEvent(element,type,fct){
                          	var listener;
                          	if(element.addEventListener){
                          		listener = function(e){
                          			fct.call(element,e);
                          		};
                          		element.addEventListener(type,listener,false);
                          	}else{
                          		listener = function(){
                          			var e = window.event;
                          			e.preventDefault = function(){
                          				e.returnValue = false;
                          			}
                          			e.stopPropagation = function(){
                          				e.cancelBubble = true;
                          			}
                          			e.target = e.srcElement;
                          			fct.call(element,e);
                          		};
                          		element.attachEvent('on'+type,listener);
                          	}
                          	return listener;
                          }
                          


                          Remarque : Les lignes 4 à 6 servent à obtenir le même comportement que sous IE. En effet, avec ce dernier, on est obligé de passer par une fonction anonyme, et donc si on attache plusieurs fois la même fonction, elle sera appelée autant de fois lors de l'évènement. Alors que si l'on passe plusieurs fois une référence vers une même fonction, la fonction ne sera appelé qu'une fois. Je passe donc aussi par une fonction anonyme avec les navigateurs standard.
                          Obtenir le comportement standard nécessite de stocker dans un array la liste des listeners et donc d'utiliser une closure pour faire ça proprement. Vu que la FAQ est destinée aux noobs, on s'en passera.

                          PS: Il est bien ce nouveau bouton (Image utilisateur) : on peut même signaler ses propres messages... "Cher modérateur, ce que je viens de dire est inconvenant, merci de m'en avertir."
                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 novembre 2010 à 11:39:15

                            Citation : LCaba

                            Donc je ne me trompais pas (cf. : "return false; dans un onclick="" ou dans un obj.onclick=function(){} ça reviens au même que preventDefault() avec addEventListener")



                            Tain je pète un câble.

                            Je viens de comprendre ma confusion. http://goo.gl/Jw0R
                            -_-

                            Bref. Le problème avec cette fonction, c'est que pour qu'elle fonctionne (j'entends par là, bien) il faut qu'elle soit compliquée...

                            Moi je vous propose directement celle de Flanagan.

                            http://www.davidflanagan.com/javascrip [...] 17/Handler.js
                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 novembre 2010 à 16:14:13

                              C'est très élaboré ça :-° Mais le but de ma fonction était d'être plutôt simple et courte pour ne pas rebuter les noobs.

                              Sinon, j'aime beaucoup et c'est très bien expliqué. J'avais fais un truc du genre à la base, sauf que je passais par une closure (j'aime pas les propriétés._pseudoPrivees) et je ne prenais pas en compte les fuites de mémoires avec IE. À ce propos, quelles versions sont concernées ? Et quand apparaît le problème ? Normalement, toutes les variables sont supprimées quand on quitte la fenêtre non ?

                              • Partager sur Facebook
                              • Partager sur Twitter

                              FOIRE AUX QUESTIONS - ANNEXE

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown