You can create and display a popup that displays attribute information from a map service. To learn how to work with map services and dynamic map layers, go to the API reference.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Display a popup (dynamic map layer)</title> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no"> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" crossorigin=""> <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" crossorigin=""></script> <!-- Load Esri Leaflet from CDN --> <script src="https://unpkg.com/esri-leaflet@3.0.19/dist/esri-leaflet.js"></script> <!-- Load Esri Leaflet Vector from CDN --> <script src="https://unpkg.com/esri-leaflet-vector@4.3.2/dist/esri-leaflet-vector.js" crossorigin=""></script> <style> html, body, #map { padding: 0; margin: 0; height: 100%; width: 100%; font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #323232; } </style> </head> <body> <div id="map"></div> <script> const accessToken = "YOUR_ACCESS_TOKEN"; const map = L.map("map", { minZoom: 3 }).setView([33.9031092, -117.4464], 17); L.esri.Vector.vectorBasemapLayer("arcgis/navigation", { token: accessToken }).addTo(map); const poolPermit = L.esri .dynamicMapLayer({ url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/PoolPermits/MapServer", // server response content type can be either 'json' (default) or 'image' f: "image", attribution: "ESRI" }) .addTo(map); poolPermit.bindPopup(function (error, featureCollection) { if (error || featureCollection.features.length === 0) { return false; } else { console.log(featureCollection.features[0].properties); return `Has pool: ${featureCollection.features[0].properties["Has_Pool"]}<br /> Has pool permit: ${featureCollection.features[0].properties["Pool_Permit"]}`; } }); </script> </body> </html>