A voir également:
- JavaScript Cannot read property
- Cannot read property 'style' of null javascript ✓ - Forum - Javascript
- Uncaught typeerror: cannot read property 'addeventlistener' of null ✓ - Forum - Javascript
- Uncaught typeerror: cannot read property 'top' of undefined - Forum - Javascript
- Uncaught TypeError: Cannot read property 'style' of null ✓ - Forum - Javascript
- Parsing failure cannot read property 1 of null free download manager ✓ - Forum - Téléchargement
5 réponses
jordane45
- Messages postés
- 31451
- Date d'inscription
- mercredi 22 octobre 2003
- Statut
- Modérateur
- Dernière intervention
- 21 février 2021
Bonjour,
Tu utilises la lib leaflet.js
IL faut donc lire la documentation de celle ci pour apprendre à utiliser correctement les fonctions qui s'y trouvent
https://leafletjs.com/reference-1.7.1.html#geojson-resetstyle
Le problème ne provenant pas de ce code js .. mais plutôt de la façon dont tu l'as utilisé dans ta page..
En l'occurrence, pour pouvoir utiliser le resetStyle .. il faut déjà avoir déclaré un style..
Tu utilises la lib leaflet.js
IL faut donc lire la documentation de celle ci pour apprendre à utiliser correctement les fonctions qui s'y trouvent
https://leafletjs.com/reference-1.7.1.html#geojson-resetstyle
Le problème ne provenant pas de ce code js .. mais plutôt de la façon dont tu l'as utilisé dans ta page..
En l'occurrence, pour pouvoir utiliser le resetStyle .. il faut déjà avoir déclaré un style..
layer.on('mouseover', function (){ this.setStyle({ color: 'green' });
Herve_be
- Messages postés
- 887
- Date d'inscription
- mercredi 4 août 2010
- Statut
- Membre
- Dernière intervention
- 22 février 2021
Je débute avec JS, j'ai voulu combiner 3 interactions : survol de souris, fin du survol et click, c'est là que ça coince, avec un seul évènement ça fonctionne.
J'appelle donc l'interaction comme ceci
Hoover est une fonction qui combine les 3
c'est probablement là qu'est mon erreur puisque, si dans cette fonction je mets seulement popup ou highlightFeature ça fonctionne, si je mets les 2 alors popup ne fonctionne plus et donne l'erreur Cannot read property, idem avec resetHighlight.
J'appelle donc l'interaction comme ceci
onEachFeature: Hoover
Hoover est une fonction qui combine les 3
function Hoover(feature, layer) { layer.on({ click: popup, mouseover: highlightFeature, mouseout: resetHighlight }); }
c'est probablement là qu'est mon erreur puisque, si dans cette fonction je mets seulement popup ou highlightFeature ça fonctionne, si je mets les 2 alors popup ne fonctionne plus et donne l'erreur Cannot read property, idem avec resetHighlight.
jordane45
- Messages postés
- 31451
- Date d'inscription
- mercredi 22 octobre 2003
- Statut
- Modérateur
- Dernière intervention
- 21 février 2021
Ben.. dans cette parti du code... tu n'as donc pas définit de style...
Donc le resetStyle ne peut pas marcher
Donc le resetStyle ne peut pas marcher
layer.setStyle({ weight: 5, color: '#666', dashArray: '', fillOpacity: 0.7 });
Herve_be
- Messages postés
- 887
- Date d'inscription
- mercredi 4 août 2010
- Statut
- Membre
- Dernière intervention
- 22 février 2021
Dans l'exemple dont j'ai donné le lien il est en effet précisé
make sure our GeoJSON layer is accessible through the geojson variable by defining it before our listeners and assigning the layer to it later:
et c'est bien ce que j'ai fait (var geojson; est avant la définition des fonctions).
make sure our GeoJSON layer is accessible through the geojson variable by defining it before our listeners and assigning the layer to it later:
var geojson; // ... our listeners geojson = L.geoJson(...);
et c'est bien ce que j'ai fait (var geojson; est avant la définition des fonctions).
Herve_be
- Messages postés
- 887
- Date d'inscription
- mercredi 4 août 2010
- Statut
- Membre
- Dernière intervention
- 22 février 2021
Bon, j'ai trouvé,
évidemment si je déclare var customLayer = L.geoJson(...
puis que j'utilise geoJson.resetStyle(e.target); comme sur l'exemple ça ne fonctionne pas
je dois utiliser customLayer.resetStyle(e.target);
Par contre je ne parviens pas à mettre 2 fonctions ensemble : ceci fonctionne très bien
highlightFeature met une trace en évidence, resetHighlight rétablit le style par défaut
Ceci fonctionne aussi très bien pour afficher un popup quand on clique sur une trace
Uncaught TypeError: Cannot read property 'feature' of undefined
sur la ligne en face de laquelle j'ai mis une flèche
et si je commente froidement cette ligne j'obtiens
Uncaught ReferenceError: feature is not defined sur la ligne suivante
Je pense qu'il s'agit simplement d'un passage de paramètres mais mes connaissances en JS ne sont pas suffisante pour que je comprenne mon erreur : un petit coup de main ?
Merci
évidemment si je déclare var customLayer = L.geoJson(...
puis que j'utilise geoJson.resetStyle(e.target); comme sur l'exemple ça ne fonctionne pas
je dois utiliser customLayer.resetStyle(e.target);
Par contre je ne parviens pas à mettre 2 fonctions ensemble : ceci fonctionne très bien
highlightFeature met une trace en évidence, resetHighlight rétablit le style par défaut
function Interaction(feature, layer) { layer.on({ mouseover: highlightFeature, mouseout: resetHighlight }); } ... var customLayer = L.geoJson(null, { ..., onEachFeature: Interaction
Ceci fonctionne aussi très bien pour afficher un popup quand on clique sur une trace
var customLayer = L.geoJson(null, { ... }, onEachFeature: function(feature, layer) { if (feature.properties.name) { layer.bindPopup(feature.properties.name); } } });mais je ne parviens pas à mettre les 2 ensemble
function popup(e) { layer = e.layer, feature = layer.feature; <== if (feature.properties.name) { layer.bindPopup(feature.properties.name); } } ... function Interaction(feature, layer) { layer.on({ mouseover: highlightFeature, mouseout: resetHighlight, click: popup }); }Highlight et Reset fonctionnent bien mais quand je clique j'obtiens
Uncaught TypeError: Cannot read property 'feature' of undefined
sur la ligne en face de laquelle j'ai mis une flèche
et si je commente froidement cette ligne j'obtiens
Uncaught ReferenceError: feature is not defined sur la ligne suivante
Je pense qu'il s'agit simplement d'un passage de paramètres mais mes connaissances en JS ne sont pas suffisante pour que je comprenne mon erreur : un petit coup de main ?
Merci
Herve_be
- Messages postés
- 887
- Date d'inscription
- mercredi 4 août 2010
- Statut
- Membre
- Dernière intervention
- 22 février 2021
onEachFeature: function(feature, layer) { if (feature.properties.desc) { layer.bindPopup(feature.properties.desc); } layer.on({ mouseover: highlightFeature, mouseout: resetHighlight }); }
J'ai utilisé l'exemple que j'ai trouvé dans la documentation leafletjs ici https://leafletjs.com/examples/choropleth/ Adding Interaction.
click: popup fonctionne
mouseover: highlightFeature aussi
mais pas les 2 ensemble, je pense donc que j'ai commis une erreur de syntaxe mais je ne trouve pas laquelle