Select platform: [Android](https://developers.google.com/maps/documentation/android-sdk/dds-datasets/make-data-features-clickable.md.txt "View this page for the Android platform docs.") [iOS](https://developers.google.com/maps/documentation/ios-sdk/dds-datasets/make-data-features-tappable.md.txt "View this page for the iOS platform docs.") [JavaScript](https://developers.google.com/maps/documentation/javascript/dds-datasets/make-data-features-clickable.md.txt "View this page for the JavaScript platform docs.")

<br />

Make data features respond to `mousemove` and `click` events, and use them to
change the appearance of a feature based on user interaction.


<iframe src="https://maps-docs-team.web.app/samples/dds-datasets-polygon-click/dist/" allow="fullscreen; fullscreen"></iframe>

## Enable dataset layer events

Take the following steps to enable events on a dataset layer:

1. Register a dataset layer for event notifications by calling the
   `addListener()` function on the dataset layer for each event you want to
   register. In this example the map also gets a listener.


   ### TypeScript

   ```typescript
   datasetLayer = innerMap.getDatasetFeatureLayer(datasetId);
   datasetLayer.style = applyStyle;

   datasetLayer.addListener('click', handleClick);
   datasetLayer.addListener('mousemove', handleMouseMove);

   // Map event listener.
   innerMap.addListener('mousemove', () => {
       // If the map gets a mousemove, that means there are no feature layers
       // with listeners registered under the mouse, so we clear the last
       // interacted feature ids.
       if (lastInteractedFeatureIds?.length) {
           lastInteractedFeatureIds = [];
           datasetLayer.style = applyStyle;
       }
   });
   ```

   ### JavaScript

   ```javascript
   datasetLayer = innerMap.getDatasetFeatureLayer(datasetId);
   datasetLayer.style = applyStyle;

   datasetLayer.addListener('click', handleClick);
   datasetLayer.addListener('mousemove', handleMouseMove);

   // Map event listener.
   innerMap.addListener('mousemove', () => {
       // If the map gets a mousemove, that means there are no feature layers
       // with listeners registered under the mouse, so we clear the last
       // interacted feature ids.
       if (lastInteractedFeatureIds?.length) {
           lastInteractedFeatureIds = [];
           datasetLayer.style = applyStyle;
       }
   });
   ```

   <br />

2. Add event handler code to style the selected feature based on the type of
   interaction.


   ### TypeScript

   ```typescript
   // Note, 'globalid' is an attribute in this Dataset.
   function handleClick(event: google.maps.FeatureMouseEvent) {
       if (event.features) {
           lastClickedFeatureIds = event.features.map(
               (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid
           );
       }
       datasetLayer.style = applyStyle;
   }

   function handleMouseMove(event: google.maps.FeatureMouseEvent) {
       if (event.features) {
           lastInteractedFeatureIds = event.features.map(
               (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid
           );
       }
       datasetLayer.style = applyStyle;
   }
   ```

   ### JavaScript

   ```javascript
   // Note, 'globalid' is an attribute in this Dataset.
   function handleClick(event) {
       if (event.features) {
           lastClickedFeatureIds = event.features.map(
               (f) => f.datasetAttributes.globalid
           );
       }
       datasetLayer.style = applyStyle;
   }

   function handleMouseMove(event) {
       if (event.features) {
           lastInteractedFeatureIds = event.features.map(
               (f) => f.datasetAttributes.globalid
           );
       }
       datasetLayer.style = applyStyle;
   }
   ```

   <br />

3. Use a feature style function to apply styles. The feature style function
   shown here conditionally applies style based on the type of interaction. Three
   styles are defined here: one to make the border bold on `mousemove`, one to
   change the background on `click`, and a default style.


   ### TypeScript

   ```typescript
   const styleDefault = {
       strokeColor: 'green',
       strokeWeight: 2.0,
       strokeOpacity: 1.0,
       fillColor: 'green',
       fillOpacity: 0.3,
   };

   const styleClicked = {
       ...styleDefault,
       strokeColor: 'blue',
       fillColor: 'blue',
       fillOpacity: 0.5,
   };

   const styleMouseMove = {
       ...styleDefault,
       strokeWeight: 4.0,
   };

   function applyStyle(params: google.maps.FeatureStyleFunctionOptions) {
       const datasetFeature = params.feature;

       // Note, 'globalid' is an attribute in this dataset.
       if (
           lastClickedFeatureIds.includes(
               (datasetFeature as google.maps.DatasetFeature).datasetAttributes
                   .globalid
           )
       ) {
           return styleClicked;
       }

       if (
           lastInteractedFeatureIds.includes(
               (datasetFeature as google.maps.DatasetFeature).datasetAttributes
                   .globalid
           )
       ) {
           return styleMouseMove;
       }
       return styleDefault;
   }
   ```

   ### JavaScript

   ```javascript
   const styleDefault = {
       strokeColor: 'green',
       strokeWeight: 2.0,
       strokeOpacity: 1.0,
       fillColor: 'green',
       fillOpacity: 0.3,
   };

   const styleClicked = {
       ...styleDefault,
       strokeColor: 'blue',
       fillColor: 'blue',
       fillOpacity: 0.5,
   };

   const styleMouseMove = {
       ...styleDefault,
       strokeWeight: 4.0,
   };

   function applyStyle(params) {
       const datasetFeature = params.feature;

       // Note, 'globalid' is an attribute in this dataset.
       if (
           lastClickedFeatureIds.includes(
               datasetFeature.datasetAttributes.globalid
           )
       ) {
           return styleClicked;
       }

       if (
           lastInteractedFeatureIds.includes(
               datasetFeature.datasetAttributes.globalid
           )
       ) {
           return styleMouseMove;
       }
       return styleDefault;
   }
   ```

   <br />

### Complete example code


### TypeScript

```typescript
const mapElement = document.querySelector('gmp-map')!;
let innerMap: google.maps.Map;
let lastInteractedFeatureIds: string[] = [];
let lastClickedFeatureIds: string[] = [];
let datasetLayer: google.maps.FeatureLayer;

// Note, 'globalid' is an attribute in this Dataset.
function handleClick(event: google.maps.FeatureMouseEvent) {
    if (event.features) {
        lastClickedFeatureIds = event.features.map(
            (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid
        );
    }
    datasetLayer.style = applyStyle;
}

function handleMouseMove(event: google.maps.FeatureMouseEvent) {
    if (event.features) {
        lastInteractedFeatureIds = event.features.map(
            (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid
        );
    }
    datasetLayer.style = applyStyle;
}

async function init() {
    // Request needed libraries.
    await google.maps.importLibrary('maps');

    // Get the inner map.
    innerMap = mapElement.innerMap;

    // Dataset ID for NYC park data.
    const datasetId = 'a75dd002-ad20-4fe6-af60-27cd2ed636b4';

    datasetLayer = innerMap.getDatasetFeatureLayer(datasetId);
    datasetLayer.style = applyStyle;

    datasetLayer.addListener('click', handleClick);
    datasetLayer.addListener('mousemove', handleMouseMove);

    // Map event listener.
    innerMap.addListener('mousemove', () => {
        // If the map gets a mousemove, that means there are no feature layers
        // with listeners registered under the mouse, so we clear the last
        // interacted feature ids.
        if (lastInteractedFeatureIds?.length) {
            lastInteractedFeatureIds = [];
            datasetLayer.style = applyStyle;
        }
    });
}

const styleDefault = {
    strokeColor: 'green',
    strokeWeight: 2.0,
    strokeOpacity: 1.0,
    fillColor: 'green',
    fillOpacity: 0.3,
};

const styleClicked = {
    ...styleDefault,
    strokeColor: 'blue',
    fillColor: 'blue',
    fillOpacity: 0.5,
};

const styleMouseMove = {
    ...styleDefault,
    strokeWeight: 4.0,
};

function applyStyle(params: google.maps.FeatureStyleFunctionOptions) {
    const datasetFeature = params.feature;

    // Note, 'globalid' is an attribute in this dataset.
    if (
        lastClickedFeatureIds.includes(
            (datasetFeature as google.maps.DatasetFeature).datasetAttributes
                .globalid
        )
    ) {
        return styleClicked;
    }

    if (
        lastInteractedFeatureIds.includes(
            (datasetFeature as google.maps.DatasetFeature).datasetAttributes
                .globalid
        )
    ) {
        return styleMouseMove;
    }
    return styleDefault;
}

void init();
```

### JavaScript

```javascript
const mapElement = document.querySelector('gmp-map');
let innerMap;
let lastInteractedFeatureIds = [];
let lastClickedFeatureIds = [];
let datasetLayer;

// Note, 'globalid' is an attribute in this Dataset.
function handleClick(event) {
    if (event.features) {
        lastClickedFeatureIds = event.features.map(
            (f) => f.datasetAttributes.globalid
        );
    }
    datasetLayer.style = applyStyle;
}

function handleMouseMove(event) {
    if (event.features) {
        lastInteractedFeatureIds = event.features.map(
            (f) => f.datasetAttributes.globalid
        );
    }
    datasetLayer.style = applyStyle;
}

async function init() {
    // Request needed libraries.
    await google.maps.importLibrary('maps');

    // Get the inner map.
    innerMap = mapElement.innerMap;

    // Dataset ID for NYC park data.
    const datasetId = 'a75dd002-ad20-4fe6-af60-27cd2ed636b4';

    datasetLayer = innerMap.getDatasetFeatureLayer(datasetId);
    datasetLayer.style = applyStyle;

    datasetLayer.addListener('click', handleClick);
    datasetLayer.addListener('mousemove', handleMouseMove);

    // Map event listener.
    innerMap.addListener('mousemove', () => {
        // If the map gets a mousemove, that means there are no feature layers
        // with listeners registered under the mouse, so we clear the last
        // interacted feature ids.
        if (lastInteractedFeatureIds?.length) {
            lastInteractedFeatureIds = [];
            datasetLayer.style = applyStyle;
        }
    });
}

const styleDefault = {
    strokeColor: 'green',
    strokeWeight: 2.0,
    strokeOpacity: 1.0,
    fillColor: 'green',
    fillOpacity: 0.3,
};

const styleClicked = {
    ...styleDefault,
    strokeColor: 'blue',
    fillColor: 'blue',
    fillOpacity: 0.5,
};

const styleMouseMove = {
    ...styleDefault,
    strokeWeight: 4.0,
};

function applyStyle(params) {
    const datasetFeature = params.feature;

    // Note, 'globalid' is an attribute in this dataset.
    if (
        lastClickedFeatureIds.includes(
            datasetFeature.datasetAttributes.globalid
        )
    ) {
        return styleClicked;
    }

    if (
        lastInteractedFeatureIds.includes(
            datasetFeature.datasetAttributes.globalid
        )
    ) {
        return styleMouseMove;
    }
    return styleDefault;
}

void init();
```

<br />