Jak umożliwić użytkownikowi udostępnianie strony internetowej, na której się znajdują

Umożliwienie użytkownikowi udostępnienia strony, na której się znajduje, to typowy wzorzec używany w aplikacjach internetowych na wielu serwisach informacyjnych, na blogach i w sklepach. Ponieważ linki to jedna z największych możliwości internetu, mamy nadzieję zwiększyć ruch od użytkowników, którzy widzą udostępniony link w witrynach społecznościowych lub otrzymują go na czacie, a nawet przez e-maila.

Nowoczesny sposób

Korzystanie z interfejsu Web Share API

Web Share API pozwala użytkownikom udostępniać dane, takie jak URL strony, na której się znajduje, wraz z tytułem i opisem. Metoda navigator.share() interfejsu Web Share API wywołuje natywny mechanizm udostępniania urządzenia. Zwraca obietnicę i przyjmuje pojedynczy argument z danymi do udostępnienia. Możliwe wartości to:

  • url: ciąg znaków reprezentujący adres URL do udostępnienia.
  • text: ciąg znaków reprezentujący tekst do udostępnienia.
  • title: ciąg znaków reprezentujący tytuł do udostępnienia. Może zostać zignorowana przez przeglądarkę.

Obsługa przeglądarek

  • 89
  • 93
  • 12.1

Źródło

Klasyczny sposób

Korzystanie z zamiarów udostępniania w serwisach społecznościowych

Nie wszystkie przeglądarki obsługują jeszcze interfejs Web Share API. Zastępczą opcją jest więc zintegrowanie z najpopularniejszymi witrynami społecznościowymi docelowych odbiorców. Popularnym przykładem jest Twitter, którego URL intencji Web umożliwia udostępnianie tekstu i adresu URL. Zwykle polega ona na utworzeniu adresu URL i otworzeniu go w przeglądarce.

Uwagi na temat interfejsu użytkownika

To dobrze, aby uszanować ikonę udostępniania ustaloną na platformie, zgodnie z wytycznymi UI dostawców systemów operacyjnych.

  • Windows:
  • Apple:
  • Android i inne systemy operacyjne:

Stopniowe ulepszanie

Poniższy fragment kodu korzysta z interfejsu Web Share API (jeśli jest obsługiwany, a następnie używa adresu URL intencji Web Intent) Twittera.

// DOM references
const button = document.querySelector('button');
const icon = button.querySelector('.icon');
const canonical = document.querySelector('link[rel="canonical"]');

// Find out if the user is on a device made by Apple.
const IS_MAC = /Mac|iPhone/.test(navigator.platform);
// Find out if the user is on a Windows device.
const IS_WINDOWS = /Win/.test(navigator.platform);
// For Apple devices or Windows, use the platform-specific share icon.
icon.classList.add(`share${IS_MAC? 'mac' : (IS_WINDOWS? 'windows' : '')}`);

button.addEventListener('click', async () => {
  // Title and text are identical, since the title may actually be ignored.
  const title = document.title;
  const text = document.title;
  // Use the canonical URL, if it exists, else, the current location.
  const url = canonical?.href || location.href;

  // Feature detection to see if the Web Share API is supported.
  if ('share' in navigator) {
    try {
      await navigator.share({
        url,
        text,
        title,
      });
      return;
    } catch (err) {
      // If the user cancels, an `AbortError` is thrown.
      if (err.name !== "AbortError") {
        console.error(err.name, err.message);
      }
    }
  }
  // Fallback to use Twitter's Web Intent URL.
  // (https://developer.twitter.com/en/docs/twitter-for-websites/tweet-button/guides/web-intent)
  const shareURL = new URL('https://twitter.com/intent/tweet');
  const params = new URLSearchParams();
  params.append('text', text);
  params.append('url', url);
  shareURL.search = params;
  window.open(shareURL, '_blank', 'popup,noreferrer,noopener');
});

Więcej informacji

Pokaz

HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>How to let the user share the website they are on</title>
    <link rel="stylesheet" href="style.css" />
    <!-- TODO: Devsite - Removed inline handlers -->
    <!-- <script src="script.js" defer></script> -->
  </head>
  <body>
    <h1>How to let the user share the website they are on</h1>
    <p>
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin at libero
      eget ante congue molestie. Integer varius enim leo. Duis est nisi,
      ullamcorper et posuere eu, mattis sed lorem. Lorem ipsum dolor sit amet,
      consectetur adipiscing elit. In at suscipit erat, et sollicitudin lorem.
    </p>
    <img src="https://placekitten.com/400/300" width=400 height=300>
    <p>
      In euismod ornare scelerisque. Nunc imperdiet augue ac porttitor
      porttitor. Pellentesque habitant morbi tristique senectus et netus et
      malesuada fames ac turpis egestas. Curabitur eget pretium elit, et
      interdum quam.
    </p>
    <hr />
    <button type="button"><span class="icon"></span>Share</button>
  </body>
</html>

CSS


        :root {
  color-scheme: dark light;
}

html {
  box-sizing: border-box;
}

*, *:before, *:after {
  box-sizing: inherit;
}

body {
  margin: 1rem;
  font-family: system-ui, sans-serif;
}

img,
video {
  height: auto;
  max-width: 100%;
}

button {
  display: flex;
}

button .icon {
  display: inline-block;
  width: 1em;
  height: 1em;
  background-size: 1em;
}

@media (prefers-color-scheme: dark) {
  button .icon {
    filter: invert();
  }
}

.share {
  background-image: url('share.svg');
}

.sharemac {
  background-image: url('sharemac.svg');
}
        

JS


        // DOM references
const button = document.querySelector('button');
const icon = button.querySelector('.icon');
const canonical = document.querySelector('link[rel="canonical"]');

// Find out if the user is on a device made by Apple.
const IS_MAC = /Mac|iPhone/.test(navigator.platform);
// Find out if the user is on a Windows device.
const IS_WINDOWS = /Win/.test(navigator.platform);
// For Apple devices or Windows, use the platform-specific share icon.
icon.classList.add(`share${IS_MAC? 'mac' : (IS_WINDOWS? 'windows' : '')}`);

button.addEventListener('click', async () => {
  // Title and text are identical, since the title may actually be ignored.
  const title = document.title;
  const text = document.title;
  // Use the canonical URL, if it exists, else, the current location.
  const url = canonical?.href || location.href;

  // Feature detection to see if the Web Share API is supported.
  if ('share' in navigator) {
    try {
      await navigator.share({
        url,
        text,
        title,
      });
      return;
    } catch (err) {
      // If the user cancels, an `AbortError` is thrown.
      if (err.name !== "AbortError") {
        console.error(err.name, err.message);
      }
    }
  }
  // Fallback to use Twitter's Web Intent URL.
  // (https://developer.twitter.com/en/docs/twitter-for-websites/tweet-button/guides/web-intent)
  const shareURL = new URL('https://twitter.com/intent/tweet');
  const params = new URLSearchParams();
  params.append('text', text);
  params.append('url', url);
  shareURL.search = params;
  window.open(shareURL, '_blank', 'popup,noreferrer,noopener');
});