IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques & Frameworks Discussion :

event click à travers les panes [LeafLet]


Sujet :

Bibliothèques & Frameworks

  1. #1
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 467
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 467
    Points : 4 656
    Points
    4 656
    Par défaut event click à travers les panes
    bonjour, j'ai differentes couches de tuiles et de polygons sur une carte leafletjs.

    j'aimerai qu'au click, je sache sur quel element j'ai clique.
    quand je clique sur un polygon (meme cache derriere des tuiles), ca fonctionne. l'event me retourne bien le polygon.

    mais quand je clique sur une tuile; pour une raison que j'ignore, il me retourne systematiquement le div conteneur de la carte.

    (pour l'exemple, je suis partie de la page d'exemple de leaflet https://leafletjs.com/examples/quick-start/
    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
    const map = L.map('map').setView([51.505, -0.09], 13);
     
    map.createPane('frontTiles'); // ici, je simule mes differentes couches
    map.getPane('frontTiles').style.zIndex = 900; // cette couche est "par dessus" les autres elements
    map.getPane('frontTiles').style.opacity = .5; // pour qu'on vois le polygon de test
     
    L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
      maxZoom: 19,
      pane: 'frontTiles'
    }).addTo(map);
     
    const polygon = L.polygon([
    		[51.509, -0.08],
    		[51.503, -0.06],
    		[51.51, -0.047]
    	]).addTo(map).bindPopup('I am a polygon.');
     
      document.addEventListener('pointerup', e => {console.log(e); });
    si je clique sur la zone du polygon, le target dans le console.log est correct
    si je clique n'importe ou ailleur dans la carte, le console.log me retourne le div conteneur.... je voudrai qu'il me retourne l'image (la tuile) sur laquelle j'ai clique

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 436
    Points : 4 930
    Points
    4 930
    Par défaut
    Bonjour,

    Quand j'ai vu le code du lien que vous avez posté, j'ai remarqué que l'événement click a été attaché à l'objet map
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function onMapClick(e) {
    		popup
    			.setLatLng(e.latlng)
    			.setContent(`You clicked the map at ${e.latlng.toString()}`)
    			.openOn(map);
    	}
     
    	map.on('click', onMapClick);
    Alors que dans votre code, l'événement attaché est pointerup et au document document.addEventListener('pointerup', e => {console.log(e); });.

    Avez vous essayé d'attacher l'événement click au map?

  3. #3
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 467
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 467
    Points : 4 656
    Points
    4 656
    Par défaut
    oui je sais.

    j'utilise l'event click de la map pour recup les lat/lon du click par exemple
    mais cet event, ne donne pas ce sur quoi tu as clique.

    par exemple, quand je clique sur une image de tuile, le e.target est ma map. et dedant, il y a des targets, qui sont tous les elements ajoute a la carte (donc aucun moyen de savoir sur quoi j'ai clique)

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 436
    Points : 4 930
    Points
    4 930
    Par défaut
    Pouvez-vous mettre un exemple en ligne reproduisant le problème? j'ai essayé mais je n'avais remarqué aucun souci ...

  5. #5
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 467
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 467
    Points : 4 656
    Points
    4 656
    Par défaut
    https://jsfiddle.net/kr1mqtjn/

    si on clique a l'endroit du triangle bleu, on voit dans le console.log, que le e.target est bien notre triangle (le path du svg)

    si on clique en dehors du triangle... on ne sait pas sur quoi on a clique, et le e.target est le div conteneur de la map

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 075
    Points : 44 656
    Points
    44 656
    Par défaut
    Bonjour,
    pas bien compris ce que tu cherches à cibler mais tu peux néanmoins connaître la tuile sur laquelle tu as cliqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    map.on("click", (e) => {
      const TILE_SIZE = 256;
      const zoom = map.getZoom();
      const point = map.project(e.latlng, zoom);
      const tile = {
        column: Math.floor(point.x / TILE_SIZE),
        row: Math.floor(point.y / TILE_SIZE)
      }
      console.log( {zoom, point, tile});
    });
    Nota: perso je n'ai pas pu ouvrir ton exemple, temps de chargement bien trop long


    [Edit] inversion de row et column dans le code

  7. #7
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 467
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 467
    Points : 4 656
    Points
    4 656
    Par défaut
    la, tu recalcules la tuile X/Y/Z en fonction du lat/lon... tu n'as pas l'element du DOM sur lequel on a clique (je dis ca, car j'ai plein de couches differentes)

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 075
    Points : 44 656
    Points
    44 656
    Par défaut
    J'ai commencé par corriger l'inversion de row et column dans le code fourni ci-dessus

    J’entrevois un peu mieux ce que tu cherches à faire même si je n'en vois pas trop l'utilité.

    Tu peux utiliser la méthode event.composedPath() pour récupérer les éléments « traversés ».
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function getInfo(e) {
      const path = event.composedPath() || [];
      path.forEach(function(elem) {
        console.log(elem.nodeName, elem);
      });
    }
    document.addEventListener("pointerup", getInfo);

  9. #9
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 467
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 467
    Points : 4 656
    Points
    4 656
    Par défaut
    je ne conaissais pas composedPath() mais malheureusement, il s'arrete aussi au div conteneur de la carte :/

  10. #10
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 075
    Points : 44 656
    Points
    44 656
    Par défaut
    Attention toutefois il faut prendre en compte que Leaflet applique ses propres styles et qu'il affecte la propriété pointer-events à none sur pas mal d'éléments.

    Voilà notamment ce que l'on trouve par exemple dans le fichier leaflet.css
    Code css : 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
    /* marker & overlays interactivity */
    .leaflet-marker-icon,
    .leaflet-marker-shadow,
    .leaflet-image-layer,
    .leaflet-pane > svg path,
    .leaflet-tile-container {
    	pointer-events: none;
    	}
     
    .leaflet-marker-icon.leaflet-interactive,
    .leaflet-image-layer.leaflet-interactive,
    .leaflet-pane > svg path.leaflet-interactive,
    svg.leaflet-image-layer.leaflet-interactive path {
    	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
    	pointer-events: auto;
    	}

  11. #11
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 467
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 467
    Points : 4 656
    Points
    4 656
    Par défaut
    aaaaaaaaaaaah

    BIEN VU !!!!

    effectivement, en re-ecrivant les regles pointer-events ca fonctionne niquel !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mouse events sur Form, à travers les contrôles
    Par Jeterh dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/11/2012, 18h52
  2. [SQL8] Chercher aux travers les stored procedure
    Par Baquardie dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/05/2006, 16h06
  3. Event Click droit sur ComboBox
    Par AF_STjohn dans le forum C++Builder
    Réponses: 8
    Dernier message: 29/04/2005, 11h48
  4. [typedef] protection à travers les espaces de noms
    Par PINGOUIN_GEANT dans le forum C++
    Réponses: 7
    Dernier message: 02/02/2005, 20h21
  5. Imbroglio avec les Panes
    Par calypso dans le forum Composants
    Réponses: 2
    Dernier message: 19/07/2004, 12h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo