Comment supprimer un auditeur dans OpenLayers 3

Je fais une copie de ma question ici à stackoverflow, parce que chez gis.stackexchange, toutes mes questions n'attirerent aucune attention – plusieurs fois, je ne pouvais pas répondre aux questions simples. Donc, ma question maintenant est de savoir comment supprimer un auditeur défini de cette façon:

map.getViewport().addEventListener('click', function (e){ console.log("clicked"); }); 

Supprimer la première chose à faire est de déclarer une fonction externe attachée au clic, puis de la supprimer avec removeEventListener

comme ça

 function myFunction(event){ //some stuff console.log("clicked"); } map.getViewport().addEventListener('click',myFunction); 

Et ensuite l'enlever par

 map.getViewport().removeEventListener('click',myFunction); 

c'est tout

Voici un extrait

 function myfunction(e) { alert("event click"); } document.getElementById("mybtn").addEventListener("click",myfunction); document.getElementById("mybtn2").addEventListener("click",function(e){ document.getElementById("mybtn").removeEventListener("click",myfunction); }); 
 <button id="mybtn">btn</button><br/> <button id="mybtn2" >remove btn click</button> 

OL3 émet ses propres types d'événements que vous pourriez utiliser à la place et, pour répondre à votre question initiale, donne un moyen simple et rapide de les désinscrire.

Regardez cet exemple: http://openlayers.org/en/v3.13.0/examples/vector-layer.html

Plus précisément, à ces lignes:

  map.on('pointermove', function(evt) { if (evt.dragging) { return; } var pixel = map.getEventPixel(evt.originalEvent); displayFeatureInfo(pixel); }); map.on('click', function(evt) { displayFeatureInfo(evt.pixel); }); 

L'objet ol.Map a une méthode on peut utiliser pour enregistrer les auditeurs d'événements sur les événements du navigateur map de ol3. Il est préférable d'utiliser ces événements au lieu des événements standard du navigateur. Consultez la liste de tous les événements du navigateur de carte ici: http://openlayers.org/fr/v3.13.0/apidoc/ol.MapBrowserEvent.html

Pour vous désinscrire , vous pouvez:

A) utilisez la méthode un , mais assurez-vous de donner la même méthode de rappel que le deuxième argument. En d'autres termes:

  var callback = function(evt) { displayFeatureInfo(evt.pixel); }; map.on('click', callback); map.un('click', callback); 

B) une autre façon est d'utiliser la méthode ol.Observable.unByKey , que j'aime beaucoup. Lors de l'appel ou once , il renvoie une clé qui fait référence à l'événement. Vous pouvez ensuite utiliser cette clé pour ne pas écouter votre événement:

  var key = map.on('click', function(evt) { displayFeatureInfo(evt.pixel); }); ol.Observable.unByKey(key); 

Je trouve b) être plus amical car vous pouvez enregistrer un tas d'auditeurs d'événements et mettre toutes les clés à l'intérieur et à l'échelle. Lorsque vous souhaitez les désinstaller tous, faites une boucle dans le tableau et appelez la méthode unByKey, puis videz le tableau. Il génère moins de code que de ne pas enregistrer tous les événements manuellement.