Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
712 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [Javascript] Délimiter une zone

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Javascript] Délimiter une zone

n°1498203
bepimaco
Festina lente
Posté le 03-01-2007 à 12:28:51  profilanswer
 

Bonjour,
 
J'ai un div de 100px de large que je vourais diviser en 2 : si on clique à gauche ça déclenche x, (et y pour la droite). Est-ce faisable ?
 
Benjamin

mood
Publicité
Posté le 03-01-2007 à 12:28:51  profilanswer
 

n°1498221
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-01-2007 à 13:40:42  profilanswer
 

mets deux divs dedans chacun avec un handler de click différent [:spamafote]

n°1498229
bepimaco
Festina lente
Posté le 03-01-2007 à 13:49:50  profilanswer
 

J'ai commencé par là, mais ça me génère d'autre problème. La solution la plus simple semblait être de ne faire qu'un seul calque avec 2 sones réactives.
 
Mais j'ai l'impression que c'est un peu complexe, je vais essayer de résoudre l'autre problème.

n°1498233
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-01-2007 à 13:56:22  profilanswer
 

Code :
  1. <divstyle="width:100px">
  2. <div style="float:left; width:50%;" onclick="alert('gauche')">
  3.   gauche
  4. </div>
  5. <div style="float:left; width:50%;" onclick="alert('droite')">
  6.   droite
  7. </div>
  8. <br style="clear:both"/>
  9. </div>


Edit: de tête hein, donc je garantis rien
Edit2: les onclicks comme ça c'est un peu dégueux faudrait le faire proprement


Message édité par anapajari le 03-01-2007 à 13:57:14
n°1498261
bepimaco
Festina lente
Posté le 03-01-2007 à 14:37:56  profilanswer
 

Merci anpajari,
 
Je vous expose le problème :
http://yearbook.bepimaco.fr/administration/acces.php
 
Lorsque la souris survole le point en début de chaque ligne, plusieurs icônes apparaissent. En l'occurence il y en a 2 : éditer ou supprimer la fiche.
 
La méthode utilisée est la modification du DOM en javascript. Un évènement onmouseover déclenche une fonction Javascript qui ajoute un DIV. A l'inverse un évènement onmouseover supprime le DIV.
 
Jusque là aucun problème, et j'ai la structure suivante :

Code :
  1. <div id="boite">yyyyy</div>


Par contre, je ne peux pas différencier l'un et l'autre bouton
 
Il suffit alors de rajouter 2 images à l'intérieur

Code :
  1. <div id="boite">
  2.      <img class="gauche" />
  3.      <img class="droit" />
  4. </div>


 
Mais là, le problème vient du fait que lorsque la souris passe sur une image, il considère que je sors du div boite, et ça génère une erreur.
 
[EDIT] dans la page en lien, le premier bloc utilise la technique n°2, les 3 suivant la technique n° 1.


Message édité par bepimaco le 03-01-2007 à 14:39:04
n°1498342
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-01-2007 à 16:48:24  profilanswer
 

Bon alors d'abord, la structure de ton document html est pas terrible terrible et pareil pour tes css :o
C'est pas parce qu'on dit partout que les tableaux c'est le mal que lorsque tu as besoin de faire une tableau il faut que tu le fasses avec des div/p en floatant, ça c'est pas une bonne idée du tout!
Et puis même pourquoi prendre des p pour les rendre floatant? Un span ne suffisait pas?

 

Pour tes css, un petit truc qui te simplifiera la vie tu peux donner plusieurs classes à un noeud comme ça:

Code :
  1. <span class="classe1 classe2">truc</span>


ça t'evitera les rédondances à la con sur ligne0 et ligne1 par exemple.

 

Maintenant pour en revenir à ton problème js, pareil c'est pas génial comme tu fais. Créer/Détruire des noeuds à chaque fois c'est super gourmant et ça sert à rien.
Voila un petit truc qui devrait marche un peu mieux, avec des commentaires en dessous:

Code :
  1. <script type="text/javascript">
  2. /***
  3. Class Bubble
  4. ***/
  5. function Bubble(imgList){
  6.   var self = this;
  7.   self.currentUser = null;
  8.   self.isDisplayed = false;
  9.   self.node = document.createElement('div');
  10.   self.node.className = 'bubble';
  11.   if(!imgList==null || typeof(imgList)!='object'){
  12.     alert('invalid param, aborting');
  13.     return false;
  14.   }
  15.   for(img in imgList){
  16.     var imgNode = document.createElement('img');
  17.     for(att in imgList[img]){
  18.       if (  att == 'onclick' && imgList[img][att] != null){
  19.         if(imgList[img]['onclick'] != null ){
  20.           imgNode.onclick = function(e){
  21.             eval(imgList[img]['onclick']);
  22.           }
  23.         }
  24.       } else if(imgList[img][att] != null ){
  25.         imgNode.setAttribute(att, imgList[img][att]);
  26.       }
  27.     }
  28.     imgNode.onmouseout = function(e){
  29.       if(self.isDisplayed) self.hide();
  30.     }
  31.     self.node.appendChild(imgNode);
  32.   }
  33.   document.getElementsByTagName('body')[0].appendChild(self.node);
  34. }
  35. Bubble.prototype.display = function (evt, node){
  36.   var self = this;
  37.   if(self.isDisplayed) return;
  38.   self.currentUser = node.getAttribute('id');
  39.   self.node.style.display = "block";
  40.   self.node.style.top = node.offsetTop + 'px';
  41. }
  42. Bubble.prototype.hide = function (){
  43.   var self = this;
  44.   self.currentUser = null;
  45.   self.node.style.display = "none";
  46. }
  47. /******/
  48. function truc1(id){
  49.   alert('truc1 pour id:'+id);
  50. }
  51. function truc2(id){
  52.   alert('truc2 pour id:'+id);
  53. }
  54. window.onload = function (e){
  55.   //creation objet bubble
  56.   var bubbleParams = new Array(
  57.       {"src":"img1.gif","alt":"gauche","onclick":"truc1(self.currentUser)"},
  58.       {"src":"img2.gif","alt":"droite","onclick":"truc2(self.currentUser)"}
  59.       );
  60.   var bubble = new Bubble(bubbleParams);
  61.   //initialisation des divs
  62.   var divNodes = document.getElementById('principal').getElementsByTagName('div');
  63.   for(var i=0; i<divNodes.length;i++){
  64.     if ( divNodes[i].className.substring(0,5) == 'ligne'){
  65.       divNodes[i].onmouseover = function(e){
  66.         bubble.display(e, this);
  67.       }
  68.     }
  69.   }
  70. }
  71.   </script>
  72.   <style type="text/css">
  73.   div.bubble{
  74.     position: absolute;
  75.     left:10px;
  76.     top:0px;
  77.     border: 1px solid black;
  78.     background-color: red;
  79.     width: 40px;
  80.     display: none;
  81.   }
  82.   </style>


Donc pour que ça marche avec ton truc vire tous les onmouseover sur les images et rouler-jeunesse ( en théorie).
Maintenant 2/3 trucs:

  • le handler est maintenant sur tout le div, ce qui n'est pas forcément ce que tu souhaitais. Si tu as besoin de l'avoir uniquement sur l'image joue avec le getElementsByTagName du onload. Par contre il faut absolument passer le noeud div donc utilise parentNode.
  • j'ai pas du tout tester sous IE mais de mémoire ça doit "presque" marcher. Je dis presque car IE ne gère pas exactement de la même façon offsetTop, il doit y avoir un décalage de quelques pixels. Pas d'autres solutions que de tester le navigateur et en fonction de rajouter ce qui manque.
  • la gestion des handlers tranmis en paramètre est franchement pas terrible mais j'avais pas vraiment le temps de faire mieux
  • a toi de modifier la css pour que cela ressemble à ce que tu veux


Message édité par anapajari le 03-01-2007 à 16:50:12
n°1498531
bepimaco
Festina lente
Posté le 03-01-2007 à 23:59:47  profilanswer
 

Merci beaucoup anapajari.
Etant débutant en Javascript, j'ai mis un peu de temps à comprendre tout le code. Mais je pense avoir compris le principe.
 
Reste quelques zones d'ombres.
 
- J'ai essayé de changer le handler pour l'affecter à l'image, mais malgré toutes mes tentatives, rien ne fonctionne.
 
Mais à la limite, ce n'est pas le plus important.
 
Le nouveau DIV se place directement de le BODY, et s'il est bien à la bonne hauteur (IE + Firefox), il est en revanche à gauche de l'écran. J'ai essayé d'affecter le DIV créé à l'intérieur du DIV principal, mais rien ne marche.
 
J'ai l'impression que les 2 questions sont liées ... comment changer l'affectation des évènement ?
 
Merci beaucoup, je pense avoir pas mal progressé ce soir !

n°1498535
bepimaco
Festina lente
Posté le 04-01-2007 à 00:08:57  profilanswer
 

Pour la position horizontal, j'ai trouvé ; il suffit de jouer avec les DIV. Ca plante encore avec IE, mais je devrais régler la solution.

n°1498578
anapajari
s/travail/glanding on hfr/gs;
Posté le 04-01-2007 à 09:28:41  profilanswer
 

quand je parlais du handler on est bien d'accord que j'évoquais le :

Code :
  1. "truc1(self.currentUser)"


Et quand tu modifies ça, ça marche pas ?
Le lien d'en haut est toujours bon pour vérifier?

n°1498585
bepimaco
Festina lente
Posté le 04-01-2007 à 09:47:14  profilanswer
 

J'ai tout mis à jour sur le lien du haut

mood
Publicité
Posté le 04-01-2007 à 09:47:14  profilanswer
 

n°1498712
bepimaco
Festina lente
Posté le 04-01-2007 à 13:15:30  profilanswer
 

Il y a un problème ici

Code :
  1. for(img in imgList){
  2.    var imgNode = document.createElement('img');
  3.    for(att in imgList[img]){
  4.      if (  att == 'onclick' && imgList[img][att] != null){
  5.        if(imgList[img]['onclick'] != null ){
  6.          imgNode.onclick = function(e){
  7.            eval(imgList[img]['onclick']);
  8.          }
  9.        }
  10.      } else if(imgList[img][att] != null ){
  11.        imgNode.setAttribute(att, imgList[img][att]);
  12.      }
  13.    }
  14.    imgNode.onmouseout = function(e){
  15.      if(self.isDisplayed) self.hide();
  16.    }
  17.    self.node.appendChild(imgNode);
  18. }


 
Plus particulièrement à la ligne 7
 
La boucle for passe en revue toutes les images de imgListe. Ce qui fait que lorsque la fonction (e) (ligne 6) est appelée, l'image en mémoire est la dernière. Donc, quelque soit l'image cliquée sur la page, ce sont les attributs de la dernière image qui sont pris en compte.
 
J'ai teté en remplacant eval(imgList[img]['onclick'] par eval(imgList[0]['onclick'], et c'est effecitvement de là que vient le problème. J'ai essayé pas mal de truc (d'où le changement des noms de variables !) Mais j'en reviens toujours au même point.
 

n°1498715
anapajari
s/travail/glanding on hfr/gs;
Posté le 04-01-2007 à 13:23:00  profilanswer
 

yep c'est normal j'ai fait ça un peu trop vite.
Alors explication: le eval est effectué au moment du onclick sur le noeud, donc le 'img' pris est celui de la dernière itération et ça pouvait pas marcher.
Pour corriger, change les lignes 5 à 8 en:

Code :
  1. if(imgList[img]['onclick'] != null ){
  2.           imgNode.handler = imgList[img]['onclick'];
  3.           imgNode.onclick = function(e){
  4.             eval(this.handler);
  5.           }
  6.         }


et ça devrait rouler

n°1498724
bepimaco
Festina lente
Posté le 04-01-2007 à 13:33:05  profilanswer
 

Merci beaucoup. Ca marche effectivement très bien.
 
J'essaie de comprendre tout ça, mais c'est un peu nouveau. En tout cas, j'avance grâce à vous.

n°1499813
bepimaco
Festina lente
Posté le 06-01-2007 à 20:13:05  profilanswer
 

Bonsoir,
 
Si je résume le fonctionnement de la "Bubble" :

  • on crée un objet plusieurs boutons
  • on lui affecte des méthodes qui l'affiche et l'enlève
  • lors du survol d'une ligne, la méthode affichage est appelée, avec en paramètre la hauteur de la ligne (c'est pas tout à fait ça, mais c'est l'idée)


Pour pouvoir changer une des images, j'ai créé un second objet.
 
Le problème, c'est que je n'arrive pas à atteindre les méthodes, hors de la classe roulette. Pour être précis, je n'arrvei pas à "l'effacer". Avez-vous une idée ?
http://yearbook.bepimaco.fr/administration/acces.php
En visitant le lien et en parcourant la page vous comprendrez vite le problème.
 
Ce n'est pas vraiment un problème. Mais je voudrais vraiment comprendre comment tout interagit ... bref, c'est plus pour approfondir le sujet plus que pour le résultat de cette page.
 
Merci

n°1500179
anapajari
s/travail/glanding on hfr/gs;
Posté le 08-01-2007 à 09:48:25  profilanswer
 

bepimaco a écrit :

Bonsoir,
 
Si je résume le fonctionnement de la "Bubble" :

  • on crée un objet plusieurs boutons
  • on lui affecte des méthodes qui l'affiche et l'enlève
  • lors du survol d'une ligne, la méthode affichage est appelée, avec en paramètre la hauteur de la ligne (c'est pas tout à fait ça, mais c'est l'idée)



C'est à peu près ça oui.  
Pour l'affichage en fait c'est le noeud sur lequel a eu lieu l'event plutot que la hauteur de la ligne mais ça revient effectivement au même.

bepimaco a écrit :

Pour pouvoir changer une des images, j'ai créé un second objet.


Tu as fait un autre new Bubble donc?
 

bepimaco a écrit :

Le problème, c'est que je n'arrive pas à atteindre les méthodes, hors de la classe roulette. Pour être précis, je n'arrvei pas à "l'effacer". Avez-vous une idée ?
http://yearbook.bepimaco.fr/administration/acces.php
En visitant le lien et en parcourant la page vous comprendrez vite le problème.


Pour accèder aux méthodes d'un objet il faut faire:

Code :
  1. var a = new monObject();
  2. a.laMethodeQueJeVeuxAppeler();



Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [Javascript] Délimiter une zone

 

Sujets relatifs
variable dans du javascript, problème de " et de ' ...Aide pour une débutante en javascript
[Résolu] Javascript / AJAX - Problème de réponse de requeteFaire des requettes http en javascript ou php
[Javascript] menu déroulant[Javascript] comment remplacer une image ouverte???
javascript Greasemonkey : problème de perfo ?javascript et ie 7
Plus de sujets relatifs à : [Javascript] Délimiter une zone


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR