इवेंट

प्लैटफ़ॉर्म चुनें: Android iOS JavaScript

इस पेज पर, यूज़र इंटरफ़ेस इवेंट और गड़बड़ी वाले इवेंट के बारे में बताया गया है. इन्हें सुना जा सकता है और प्रोग्राम के हिसाब से मैनेज किया जा सकता है.

यूज़र इंटरफ़ेस इवेंट

ब्राउज़र में JavaScript, इवेंट पर आधारित होती है. इसका मतलब है कि JavaScript, इवेंट जनरेट करके इंटरैक्शन का जवाब देती है. साथ ही, यह उम्मीद करती है कि कोई प्रोग्राम काम के इवेंट सुनता है. इवेंट दो तरह के होते हैं:

  • उपयोगकर्ता के इवेंट (जैसे कि "क्लिक" माउस इवेंट) को डीओएम से Maps JavaScript API में भेजा जाता है. ये इवेंट, स्टैंडर्ड DOM इवेंट से अलग होते हैं.
  • एमवीसी की स्थिति में बदलाव होने पर मिलने वाली सूचनाएं, Maps JavaScript API ऑब्जेक्ट में हुए बदलावों को दिखाती हैं. इन्हें property_changed कन्वेंशन का इस्तेमाल करके नाम दिया जाता है.

Maps JavaScript API का हर ऑब्जेक्ट, नाम वाले कई इवेंट एक्सपोर्ट करता है. जिन प्रोग्राम को कुछ इवेंट में दिलचस्पी होती है वे उन इवेंट के लिए, JavaScript इवेंट लिसनर रजिस्टर करते हैं. साथ ही, जब उन इवेंट को ऑब्जेक्ट पर इवेंट हैंडलर रजिस्टर करने के लिए addListener() को कॉल करके रिसीव किया जाता है, तब वे कोड को एक्ज़ीक्यूट करते हैं.

यहां दिए गए सैंपल में दिखाया गया है कि मैप के साथ इंटरैक्ट करने पर, google.maps.Map कौनसे इवेंट ट्रिगर करता है.

इवेंट की पूरी सूची देखने के लिए, Maps JavaScript API का रेफ़रंस देखें. इवेंट को हर ऑब्जेक्ट के लिए अलग सेक्शन में लिस्ट किया जाता है.

यूज़र इंटरफ़ेस इवेंट

Maps JavaScript API में मौजूद कुछ ऑब्जेक्ट, उपयोगकर्ता के इवेंट का जवाब देने के लिए डिज़ाइन किए गए हैं. जैसे, माउस या कीबोर्ड इवेंट. उदाहरण के लिए, यहां कुछ ऐसे उपयोगकर्ता इवेंट दिए गए हैं जिन्हें google.maps.marker.AdvancedMarkerElement ऑब्जेक्ट सुन सकता है:

  • 'click'
  • 'drag'
  • 'dragend'
  • 'dragstart'
  • 'gmp-click'

पूरी सूची देखने के लिए, AdvancedMarkerElement क्लास देखें. ये इवेंट, स्टैंडर्ड DOM इवेंट की तरह दिख सकते हैं. हालांकि, ये असल में Maps JavaScript API का हिस्सा होते हैं. अलग-अलग ब्राउज़र, अलग-अलग डीओएम इवेंट मॉडल लागू करते हैं. इसलिए, Maps JavaScript API इन तरीकों को उपलब्ध कराता है, ताकि डीओएम इवेंट को सुना जा सके और उनका जवाब दिया जा सके. इसके लिए, अलग-अलग ब्राउज़र की खास बातों को हैंडल करने की ज़रूरत नहीं होती. ये इवेंट, आम तौर पर इवेंट में आर्ग्युमेंट भी पास करते हैं. इससे यूज़र इंटरफ़ेस (यूआई) की कुछ स्थितियों (जैसे, माउस की पोज़िशन) के बारे में पता चलता है.

एमवीसी की स्थिति में बदलाव

एमवीसी ऑब्जेक्ट में आम तौर पर स्टेट शामिल होती है. जब भी किसी ऑब्जेक्ट की प्रॉपर्टी बदलती है, Maps JavaScript API एक इवेंट ट्रिगर करता है. इससे पता चलता है कि प्रॉपर्टी बदल गई है. उदाहरण के लिए, जब मैप का ज़ूम लेवल बदलता है, तो API मैप पर zoom_changed इवेंट ट्रिगर करेगा. ऑब्जेक्ट पर इवेंट हैंडलर रजिस्टर करने के लिए, addListener() को कॉल करके, स्थिति में होने वाले इन बदलावों को रोका जा सकता है.

उपयोगकर्ता इवेंट और एमवीसी की स्थिति में होने वाले बदलाव एक जैसे दिख सकते हैं. हालांकि, आपको अपने कोड में इन्हें अलग-अलग तरीके से इस्तेमाल करना चाहिए. उदाहरण के लिए, एमवीसी इवेंट अपने इवेंट में आर्ग्युमेंट पास नहीं करते हैं. उस ऑब्जेक्ट पर सही getProperty तरीके को कॉल करके, एमवीसी की स्थिति में बदलाव होने पर बदली गई प्रॉपर्टी की जांच करें.

इवेंट मैनेज करना

इवेंट की सूचनाओं के लिए रजिस्टर करने के लिए, addListener() इवेंट हैंडलर का इस्तेमाल करें. यह तरीका, सुनने के लिए एक इवेंट और बताए गए इवेंट के होने पर कॉल करने के लिए एक फ़ंक्शन लेता है.

उदाहरण: मैप और मार्कर इवेंट

यहां दिए गए कोड में, उपयोगकर्ता इवेंट के साथ-साथ स्थिति में बदलाव वाले इवेंट भी शामिल हैं. इस उदाहरण में, मार्कर से एक इवेंट हैंडलर अटैच किया गया है. इस मार्कर पर क्लिक करने से, मैप ज़ूम हो जाता है. यह center प्रॉपर्टी में हुए बदलावों के लिए, मैप में एक इवेंट हैंडलर भी अटैच करता है. साथ ही, center_changed इवेंट मिलने के तीन सेकंड बाद, मैप को मार्कर पर वापस ले जाता है.

TypeScript

async function initMap() {
    // Request needed libraries.
    (await google.maps.importLibrary('maps')) as google.maps.MapsLibrary;
    (await google.maps.importLibrary('marker')) as google.maps.MarkerLibrary;

    // Retrieve the map element.
    const mapElement = document.querySelector(
        'gmp-map'
    ) as google.maps.MapElement;

    // Get the inner map from the map element.
    const innerMap = mapElement.innerMap;

    const center = mapElement.center;

    const marker = new google.maps.marker.AdvancedMarkerElement({
        position: center,
        map: innerMap,
        title: 'Click to zoom',
        gmpClickable: true,
    });

    innerMap.addListener('center_changed', () => {
        // 3 seconds after the center of the map has changed,
        // pan back to the marker.
        window.setTimeout(() => {
            innerMap.panTo(marker.position as google.maps.LatLng);
        }, 3000);
    });

    // Zoom in when the marker is clicked.
    marker.addListener('gmp-click', () => {
        innerMap.setZoom(8);
        innerMap.setCenter(marker.position as google.maps.LatLng);
    });
}

initMap();

JavaScript

async function initMap() {
    // Request needed libraries.
    (await google.maps.importLibrary('maps'));
    (await google.maps.importLibrary('marker'));
    // Retrieve the map element.
    const mapElement = document.querySelector('gmp-map');
    // Get the inner map from the map element.
    const innerMap = mapElement.innerMap;
    const center = mapElement.center;
    const marker = new google.maps.marker.AdvancedMarkerElement({
        position: center,
        map: innerMap,
        title: 'Click to zoom',
        gmpClickable: true,
    });
    innerMap.addListener('center_changed', () => {
        // 3 seconds after the center of the map has changed,
        // pan back to the marker.
        window.setTimeout(() => {
            innerMap.panTo(marker.position);
        }, 3000);
    });
    // Zoom in when the marker is clicked.
    marker.addListener('gmp-click', () => {
        innerMap.setZoom(8);
        innerMap.setCenter(marker.position);
    });
}
initMap();
उदाहरण देखें

सैंपल आज़माएं

अहम जानकारी: अगर आपको व्यूपोर्ट में हुए बदलाव का पता लगाना है, तो zoom_changed और center_changed इवेंट के बजाय, bounds_changed इवेंट का इस्तेमाल करें. Maps JavaScript API इन इवेंट को अलग-अलग ट्रिगर करता है. इसलिए, जब तक व्यूपोर्ट में बदलाव नहीं हो जाता, तब तक getBounds() काम के नतीजे नहीं दिखा सकता. अगर आपको इस तरह के इवेंट के बाद getBounds() करना है, तो bounds_changed इवेंट को सुनें.

उदाहरण: शेप में बदलाव करने और खींचकर छोड़ने वाले इवेंट

किसी शेप में बदलाव करने या उसे खींचने पर, कार्रवाई पूरी होने के बाद इवेंट ट्रिगर होता है. इवेंट और कुछ कोड स्निपेट की सूची के लिए, शेप देखें.

उदाहरण देखें (rectangle-event.html)

यूज़र इंटरफ़ेस (यूआई) इवेंट में आर्ग्युमेंट ऐक्सेस करना

Maps JavaScript API में यूज़र इंटरफ़ेस (यूआई) इवेंट आम तौर पर एक इवेंट आर्ग्युमेंट पास करते हैं. इवेंट लिसनर इस आर्ग्युमेंट को ऐक्सेस कर सकता है. इससे, इवेंट होने के समय यूज़र इंटरफ़ेस (यूआई) की स्थिति के बारे में पता चलता है. उदाहरण के लिए, यूज़र इंटरफ़ेस (यूआई) 'click' इवेंट आम तौर पर, MouseEvent पास करता है. इसमें latLng प्रॉपर्टी होती है. यह प्रॉपर्टी, मैप पर क्लिक की गई जगह के बारे में बताती है. ध्यान दें कि यह व्यवहार, यूज़र इंटरफ़ेस (यूआई) इवेंट के लिए खास है. एमवीसी की स्थिति में होने वाले बदलाव, अपने इवेंट में आर्ग्युमेंट पास नहीं करते.

इवेंट लिसनर में इवेंट के आर्ग्युमेंट को उसी तरह से ऐक्सेस किया जा सकता है जिस तरह से किसी ऑब्जेक्ट की प्रॉपर्टी को ऐक्सेस किया जाता है. इस उदाहरण में, मैप के लिए एक इवेंट लिसनर जोड़ा गया है. साथ ही, जब उपयोगकर्ता मैप पर क्लिक करता है, तो क्लिक की गई जगह पर एक मार्कर बनाया जाता है.

TypeScript

async function initMap() {
  // Request needed libraries.
  await google.maps.importLibrary("maps") as google.maps.MapsLibrary;
  await google.maps.importLibrary("marker") as google.maps.MarkerLibrary;

  const mapElement = document.querySelector('gmp-map') as google.maps.MapElement;
  const innerMap = mapElement.innerMap;

  innerMap.addListener("click", (e) => {
    placeMarkerAndPanTo(e.latLng, innerMap);
  });
}

function placeMarkerAndPanTo(latLng: google.maps.LatLng, map: google.maps.Map) {
  new google.maps.marker.AdvancedMarkerElement({
    position: latLng,
    map: map,
  });
  map.panTo(latLng);
}

initMap();

JavaScript

async function initMap() {
    // Request needed libraries.
    await google.maps.importLibrary("maps");
    await google.maps.importLibrary("marker");
    const mapElement = document.querySelector('gmp-map');
    const innerMap = mapElement.innerMap;
    innerMap.addListener("click", (e) => {
        placeMarkerAndPanTo(e.latLng, innerMap);
    });
}
function placeMarkerAndPanTo(latLng, map) {
    new google.maps.marker.AdvancedMarkerElement({
        position: latLng,
        map: map,
    });
    map.panTo(latLng);
}
initMap();
उदाहरण देखें

सैंपल आज़माएं

इवेंट लिसनर में क्लोज़र का इस्तेमाल करना

इवेंट लिसनर को लागू करते समय, किसी ऑब्जेक्ट से निजी और लगातार मौजूद रहने वाला डेटा अटैच करना अक्सर फ़ायदेमंद होता है. JavaScript, "private" इंस्टेंस डेटा के साथ काम नहीं करता. हालांकि, यह क्लोज़र के साथ काम करता है. इससे इनर फ़ंक्शन, आउटर वैरिएबल को ऐक्सेस कर पाते हैं. इवेंट लिसनर में क्लोज़र का इस्तेमाल किया जाता है. इससे उन वैरिएबल को ऐक्सेस किया जा सकता है जो आम तौर पर उन ऑब्जेक्ट से अटैच नहीं होते जिन पर इवेंट होते हैं.

यहां दिए गए उदाहरण में, इवेंट लिसनर में फ़ंक्शन क्लोज़र का इस्तेमाल किया गया है. इसका मकसद, मार्कर के सेट को कोई सीक्रेट मैसेज असाइन करना है. हर मार्कर पर क्लिक करने से, आपको सीक्रेट मैसेज का कुछ हिस्सा दिखेगा. यह हिस्सा, मार्कर में शामिल नहीं होता है.

TypeScript

async function initMap() {
    // Request needed libraries.
    (await google.maps.importLibrary('maps')) as google.maps.MapsLibrary;
    (await google.maps.importLibrary('marker')) as google.maps.MarkerLibrary;

    const mapElement = document.querySelector(
        'gmp-map'
    ) as google.maps.MapElement;
    const innerMap = mapElement.innerMap;

    const bounds: google.maps.LatLngBoundsLiteral = {
        north: -25.363882,
        south: -31.203405,
        east: 131.044922,
        west: 125.244141,
    };

    // Display the area between the location southWest and northEast.
    innerMap.fitBounds(bounds);

    // Add 5 markers to map at random locations.
    // For each of these markers, give them a title with their index, and when
    // they are clicked they should open an infowindow with text from a secret
    // message.
    const secretMessages = ['This', 'is', 'the', 'secret', 'message'];
    const lngSpan = bounds.east - bounds.west;
    const latSpan = bounds.north - bounds.south;

    for (let i = 0; i < secretMessages.length; ++i) {
        const marker = new google.maps.marker.AdvancedMarkerElement({
            position: {
                lat: bounds.south + latSpan * Math.random(),
                lng: bounds.west + lngSpan * Math.random(),
            },
            map: innerMap,
        });

        attachSecretMessage(marker, secretMessages[i]);
    }
}

// Attaches an info window to a marker with the provided message. When the
// marker is clicked, the info window will open with the secret message.
function attachSecretMessage(
    marker: google.maps.marker.AdvancedMarkerElement,
    secretMessage: string
) {
    const infowindow = new google.maps.InfoWindow({
        content: secretMessage,
    });

    marker.addListener('gmp-click', () => {
        infowindow.open(marker.map, marker);
    });
}

initMap();

JavaScript

async function initMap() {
    // Request needed libraries.
    (await google.maps.importLibrary('maps'));
    (await google.maps.importLibrary('marker'));
    const mapElement = document.querySelector('gmp-map');
    const innerMap = mapElement.innerMap;
    const bounds = {
        north: -25.363882,
        south: -31.203405,
        east: 131.044922,
        west: 125.244141,
    };
    // Display the area between the location southWest and northEast.
    innerMap.fitBounds(bounds);
    // Add 5 markers to map at random locations.
    // For each of these markers, give them a title with their index, and when
    // they are clicked they should open an infowindow with text from a secret
    // message.
    const secretMessages = ['This', 'is', 'the', 'secret', 'message'];
    const lngSpan = bounds.east - bounds.west;
    const latSpan = bounds.north - bounds.south;
    for (let i = 0; i < secretMessages.length; ++i) {
        const marker = new google.maps.marker.AdvancedMarkerElement({
            position: {
                lat: bounds.south + latSpan * Math.random(),
                lng: bounds.west + lngSpan * Math.random(),
            },
            map: innerMap,
        });
        attachSecretMessage(marker, secretMessages[i]);
    }
}
// Attaches an info window to a marker with the provided message. When the
// marker is clicked, the info window will open with the secret message.
function attachSecretMessage(marker, secretMessage) {
    const infowindow = new google.maps.InfoWindow({
        content: secretMessage,
    });
    marker.addListener('gmp-click', () => {
        infowindow.open(marker.map, marker);
    });
}
initMap();
उदाहरण देखें

सैंपल आज़माएं

इवेंट हैंडलर में प्रॉपर्टी पाना और सेट करना

Maps JavaScript API के इवेंट सिस्टम में, MVC की स्थिति में बदलाव होने पर ट्रिगर होने वाले किसी भी इवेंट में आर्ग्युमेंट पास नहीं किए जाते. (उपयोगकर्ता के इवेंट, ऐसे आर्ग्युमेंट पास करते हैं जिनकी जांच की जा सकती है.) अगर आपको एमवीसी की स्थिति में बदलाव होने पर किसी प्रॉपर्टी की जांच करनी है, तो आपको उस ऑब्जेक्ट पर सही getProperty() तरीके को साफ़ तौर पर कॉल करना होगा. इस जांच से, एमवीसी ऑब्जेक्ट की मौजूदा स्थिति हमेशा मिलती है. ऐसा हो सकता है कि यह स्थिति, इवेंट के पहली बार ट्रिगर होने के समय की स्थिति न हो.

ध्यान दें: किसी इवेंट हैंडलर में किसी प्रॉपर्टी को साफ़ तौर पर सेट करने से, अप्रत्याशित और/या अवांछित व्यवहार हो सकता है. यह इवेंट हैंडलर, उस प्रॉपर्टी की स्थिति में बदलाव होने पर जवाब देता है. ऐसी प्रॉपर्टी सेट करने से, एक नया इवेंट ट्रिगर होगा. उदाहरण के लिए, अगर इस इवेंट हैंडलर में हमेशा कोई प्रॉपर्टी सेट की जाती है, तो हो सकता है कि एक इनफ़िनिट लूप बन जाए.

यहां दिए गए उदाहरण में, ज़ूम इवेंट का जवाब देने के लिए इवेंट हैंडलर सेट अप करने का तरीका बताया गया है. इसके लिए, जानकारी वाली विंडो को ऊपर लाया जाता है, ताकि उस लेवल को दिखाया जा सके.

TypeScript

async function initMap() {
  // Request needed libraries.
  const { Map } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary;

  const originalMapCenter = new google.maps.LatLng(-25.363882, 131.044922);
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      zoom: 4,
      center: originalMapCenter,
    }
  );

  const infowindow = new google.maps.InfoWindow({
    content: "Change the zoom level",
    position: originalMapCenter,
  });

  infowindow.open(map);

  map.addListener("zoom_changed", () => {
    infowindow.setContent("Zoom: " + map.getZoom()!);
  });
}

initMap();

JavaScript

async function initMap() {
  // Request needed libraries.
  const { Map } = await google.maps.importLibrary("maps");
  const originalMapCenter = new google.maps.LatLng(-25.363882, 131.044922);
  const map = new google.maps.Map(document.getElementById("map"), {
    zoom: 4,
    center: originalMapCenter,
  });
  const infowindow = new google.maps.InfoWindow({
    content: "Change the zoom level",
    position: originalMapCenter,
  });

  infowindow.open(map);
  map.addListener("zoom_changed", () => {
    infowindow.setContent("Zoom: " + map.getZoom());
  });
}

initMap();
उदाहरण देखें

सैंपल आज़माएं

इवेंट लिसनर हटाएं

किसी इवेंट लिसनर को हटाने के लिए, उसे किसी वैरिएबल को असाइन किया जाना चाहिए. इसके बाद, removeListener() को कॉल किया जा सकता है. इसके लिए, उस वैरिएबल का नाम पास करें जिसे लिसनर असाइन किया गया था.

var listener1 = marker.addListener('click', aFunction);

google.maps.event.removeListener(listener1);

किसी इंस्टेंस से सभी लिसनर हटाने के लिए, इंस्टेंस का नाम पास करके clearInstanceListeners() को कॉल करें.

var listener1 = marker.addListener('click', aFunction);
var listener2 = marker.addListener('mouseover', bFunction);

// Remove listener1 and listener2 from marker instance.
google.maps.event.clearInstanceListeners(marker);

किसी खास इंस्टेंस के लिए, किसी खास इवेंट टाइप के सभी लिसनर हटाने के लिए, clearListeners() को कॉल करें. इसके लिए, इंस्टेंस का नाम और इवेंट का नाम पास करें.

marker.addListener('click', aFunction);
marker.addListener('click', bFunction);
marker.addListener('click', cFunction);

// Remove all click listeners from marker instance.
google.maps.event.clearListeners(marker, 'click');

ज़्यादा जानकारी के लिए, google.maps.event नेमस्पेस के रेफ़रंस दस्तावेज़ देखें.

पुष्टि करने से जुड़ी गड़बड़ियों के बारे में सुनना

अगर आपको प्रोग्राम के हिसाब से पुष्टि न हो पाने की समस्या का पता लगाना है (उदाहरण के लिए, अपने-आप बीकन भेजने के लिए), तो कॉलबैक फ़ंक्शन तैयार किया जा सकता है. अगर नीचे दिए गए ग्लोबल फ़ंक्शन को तय किया जाता है, तो पुष्टि न होने पर इसे कॉल किया जाएगा. function gm_authFailure() { /* Code */ };

टाइपस्क्रिप्ट में, फ़ंक्शन को ग्लोबल स्कोप में जोड़ना ज़रूरी हो सकता है. इसे नीचे दिखाया गया है:

// Define the callback function.
window.gm_authFailure = () => {
  console.error("Google Maps failed to authenticate.");
  /* Code */
};

// Add gm_authFailure to the global scope.
declare global {
  interface Window {
    gm_authFailure?: () => void;
  }
}
export {};