نشانگرها را قابل کلیک و در دسترس قرار دهید

شما می‌توانید با فعال کردن مدیریت رویداد کلیک، اضافه کردن متن توصیفی برای صفحه‌خوان‌ها و تنظیم مقیاس نشانگر، دسترسی به نشانگرها را آسان‌تر کنید.

  • وقتی یک نشانگر قابل کلیک (یا قابل کشیدن ) باشد، می‌تواند به ورودی صفحه‌کلید و ماوس پاسخ دهد.
  • متن مشخص شده در گزینه title توسط صفحه‌خوان‌ها قابل خواندن است و هنگامی که کاربر اشاره‌گر ماوس را روی نشانگر نگه می‌دارد، نمایش داده می‌شود.
  • افزایش اندازه نشانگرها، دقت مورد نیاز برای تعامل با آنها در همه دستگاه‌ها - به ویژه دستگاه‌های لمسی - را کاهش می‌دهد و دسترسی‌پذیری را بهبود می‌بخشد. نشانگرهای پیش‌فرض، حداقل استاندارد اندازه WCAG AA را رعایت می‌کنند، اما برای توسعه‌دهندگانی که قصد دارند از استاندارد اندازه هدف WCAG AAA پیروی کنند، اندازه نشانگر باید افزایش یابد.

برای یادگیری نحوه تغییر مقیاس نشانگر، افزودن متن عنوان و موارد دیگر، به سفارشی‌سازی اولیه نشانگر مراجعه کنید.

مثال زیر نقشه‌ای را با پنج نشانگر قابل کلیک و قابل تنظیم فوکوس نشان می‌دهد که شامل متن عنوان هستند و در مقیاس ۱.۵x تنظیم شده‌اند:

برای پیمایش نشانگرها با استفاده از صفحه کلید:

  1. از کلید Tab برای تمرکز روی اولین نشانگر استفاده کنید؛ اگر چندین نشانگر روی یک نقشه وجود دارد، از کلیدهای جهت‌نما برای جابجایی بین نشانگرها استفاده کنید.
  2. اگر نشانگر قابل کلیک است، کلید enter را برای "کلیک" فشار دهید. اگر نشانگری پنجره اطلاعات دارد، می‌توانید آن را با کلیک کردن یا با فشار دادن کلید enter یا کلید فاصله باز کنید. وقتی پنجره اطلاعات بسته می‌شود، فوکوس به نشانگر مرتبط باز می‌گردد.
  3. برای ادامه حرکت در بقیه کنترل‌های نقشه، دوباره کلید tab را فشار دهید.

قابل کلیک کردن کردن یک نشانگر

این بخش به شما نشان می‌دهد که چگونه نشانگرها را به رویدادهای کلیک واکنش نشان دهید. برای اینکه یک نشانگر قابل کلیک باشد:

  • ویژگی gmpClickable را روی true تنظیم کنید.

تایپ اسکریپت

const marker = new AdvancedMarkerElement({
    position,
    map,
    title: `${i + 1}. ${title}`,
    content: pin.element,
    gmpClickable: true,
});

جاوا اسکریپت

const marker = new AdvancedMarkerElement({
    position,
    map,
    title: `${i + 1}. ${title}`,
    content: pin.element,
    gmpClickable: true,
});

  • یک شنونده رویداد کلیک برای پاسخ به ورودی کاربر اضافه کنید.

تایپ اسکریپت

// Add a click listener for each marker, and set up the info window.
marker.addListener('click', ({ domEvent, latLng }) => {
    const { target } = domEvent;
    infoWindow.close();
    infoWindow.setContent(marker.title);
    infoWindow.open(marker.map, marker);
});

جاوا اسکریپت

// Add a click listener for each marker, and set up the info window.
marker.addListener('click', ({ domEvent, latLng }) => {
    const { target } = domEvent;
    infoWindow.close();
    infoWindow.setContent(marker.title);
    infoWindow.open(marker.map, marker);
});

  • برای اینکه دوباره نتوان روی یک نشانگر کلیک کرد، removeListener فراخوانی کنید تا شنونده رویداد کلیک را حذف کند:

    // Remove the listener.
    google.maps.event.removeListener(clickListener);
    

برای افزایش بیشتر دسترسی:

  • با استفاده از گزینه AdvancedMarkerElement.title ، متن توصیفی برای یک نشانگر تنظیم کنید.
  • با استفاده از ویژگی scale در PinElement مقیاس نشانگر را افزایش دهید.

کد مثال کامل

کد منبع کامل مثال را ببینید

تایپ اسکریپت

async function initMap() {
    // Request needed libraries.
    const { Map, InfoWindow } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary;
    const { AdvancedMarkerElement, PinElement } = await google.maps.importLibrary("marker") as google.maps.MarkerLibrary;

    const map = new Map(document.getElementById("map") as HTMLElement, {
        zoom: 12,
        center: { lat: 34.84555, lng: -111.8035 },
        mapId: '4504f8b37365c3d0',
    });

    // Set LatLng and title text for the markers. The first marker (Boynton Pass)
    // receives the initial focus when tab is pressed. Use arrow keys to move
    // between markers; press tab again to cycle through the map controls.
    const tourStops = [
        {
            position: { lat: 34.8791806, lng: -111.8265049 }, 
            title: "Boynton Pass"
        },
        {
            position: { lat: 34.8559195, lng: -111.7988186 }, 
            title: "Airport Mesa"
        },
        {
            position: { lat: 34.832149, lng: -111.7695277 }, 
            title: "Chapel of the Holy Cross"
        },
        {
            position: { lat: 34.823736, lng: -111.8001857 }, 
            title: "Red Rock Crossing"
        },
        {
            position: { lat: 34.800326, lng: -111.7665047 }, 
            title: "Bell Rock"
        },
    ];

    // Create an info window to share between markers.
    const infoWindow = new InfoWindow();

    // Create the markers.
    tourStops.forEach(({position, title}, i) => {
        const pin = new PinElement({
            //@ts-ignore
            glyphText: `${i + 1}`,
            scale: 1.5,
        });
        const marker = new AdvancedMarkerElement({
            position,
            map,
            title: `${i + 1}. ${title}`,
            content: pin.element,
            gmpClickable: true,
        });
        // Add a click listener for each marker, and set up the info window.
        marker.addListener('click', ({ domEvent, latLng }) => {
            const { target } = domEvent;
            infoWindow.close();
            infoWindow.setContent(marker.title);
            infoWindow.open(marker.map, marker);
        });
    });
}

initMap();

جاوا اسکریپت

async function initMap() {
    // Request needed libraries.
    const { Map, InfoWindow } = await google.maps.importLibrary("maps");
    const { AdvancedMarkerElement, PinElement } = await google.maps.importLibrary("marker");
    const map = new Map(document.getElementById("map"), {
        zoom: 12,
        center: { lat: 34.84555, lng: -111.8035 },
        mapId: '4504f8b37365c3d0',
    });
    // Set LatLng and title text for the markers. The first marker (Boynton Pass)
    // receives the initial focus when tab is pressed. Use arrow keys to move
    // between markers; press tab again to cycle through the map controls.
    const tourStops = [
        {
            position: { lat: 34.8791806, lng: -111.8265049 },
            title: "Boynton Pass"
        },
        {
            position: { lat: 34.8559195, lng: -111.7988186 },
            title: "Airport Mesa"
        },
        {
            position: { lat: 34.832149, lng: -111.7695277 },
            title: "Chapel of the Holy Cross"
        },
        {
            position: { lat: 34.823736, lng: -111.8001857 },
            title: "Red Rock Crossing"
        },
        {
            position: { lat: 34.800326, lng: -111.7665047 },
            title: "Bell Rock"
        },
    ];
    // Create an info window to share between markers.
    const infoWindow = new InfoWindow();
    // Create the markers.
    tourStops.forEach(({ position, title }, i) => {
        const pin = new PinElement({
            //@ts-ignore
            glyphText: `${i + 1}`,
            scale: 1.5,
        });
        const marker = new AdvancedMarkerElement({
            position,
            map,
            title: `${i + 1}. ${title}`,
            content: pin.element,
            gmpClickable: true,
        });
        // Add a click listener for each marker, and set up the info window.
        marker.addListener('click', ({ domEvent, latLng }) => {
            const { target } = domEvent;
            infoWindow.close();
            infoWindow.setContent(marker.title);
            infoWindow.open(marker.map, marker);
        });
    });
}
initMap();

سی‌اس‌اس

/* 
 * Always set the map height explicitly to define the size of the div element
 * that contains the map. 
 */
#map {
  height: 100%;
}

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}

اچ‌تی‌ام‌ال

<html>
  <head>
    <title>Advanced Marker Accessibility</title>

    <link rel="stylesheet" type="text/css" href="./style.css" />
    <script type="module" src="./index.js"></script>
  </head>
  <body>
    <div id="map"></div>

    <!-- prettier-ignore -->
    <script>(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})
        ({key: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "beta"});</script>
  </body>
</html>

نمونه را امتحان کنید