YouTube iFrame API இல் பிளேலிஸ்ட் மெனு பட்டனைத் தானாகத் தூண்டுவதற்கு JavaScript ஐப் பயன்படுத்துதல்

YouTube iFrame API இல் பிளேலிஸ்ட் மெனு பட்டனைத் தானாகத் தூண்டுவதற்கு JavaScript ஐப் பயன்படுத்துதல்
YouTube iFrame API இல் பிளேலிஸ்ட் மெனு பட்டனைத் தானாகத் தூண்டுவதற்கு JavaScript ஐப் பயன்படுத்துதல்

யூடியூப் பிளேலிஸ்ட் மெனு பட்டனை தானியக்கமாக்குதல் லோடில் கிளிக் செய்யவும்

யூடியூப் பிளேலிஸ்ட்களை உட்பொதிப்பதே, கவனமாகத் தேர்ந்தெடுக்கப்பட்ட வீடியோ மெட்டீரியல் மூலம் இணையதளப் பார்வையாளர்களை ஈர்க்கும் ஒரு நன்கு விரும்பப்பட்ட முறை. பயனர் அனுபவத்தை மேம்படுத்த, பிளேலிஸ்ட் மெனுவை அணுகுவது போன்ற சில பயனர் செயல்பாடுகள் தானியக்கமாக இருக்க வேண்டும். உட்பொதிக்கப்பட்ட வீடியோ முதலில் ஏற்றப்படும் போது, ​​பிளேலிஸ்ட் மெனு பட்டன் தானாக கிளிக் செய்யப்படுவது ஒரு பொதுவான காட்சியாகும்.

யூடியூப் ஐஃப்ரேம் ஏபிஐ மூலம் யூடியூப் வீடியோக்களை கட்டுப்படுத்துவதும் உட்பொதிப்பதும் நெகிழ்வானது. ஜாவாஸ்கிரிப்ட் மூலம், டெவலப்பர்கள் குறிப்பிட்ட பொத்தான்கள் அல்லது செயல்களைத் தூண்டுவது போன்ற வீடியோ பிளேயரின் நடத்தையை தங்கள் தேவைகளுக்கு ஏற்ப மாற்றிக்கொள்ளலாம். இந்த நிகழ்வில், ஒரு குறைபாடற்ற பயனர் அனுபவம் "பிளேலிஸ்ட் மெனு பட்டன்" பக்கம் ஏற்றப்படும்போது உடனடியாகச் செயல்படும்.

ஐஃப்ரேமில் உட்பொதிக்கப்பட்ட YouTube பிளேலிஸ்ட்டின் ஆரம்ப ஏற்றத்தின் போது "பிளேலிஸ்ட் மெனு பட்டனில்" தானாக கிளிக் செய்வதை தூண்டுவதற்கு YouTube iFrame API ஐ எவ்வாறு பயன்படுத்துவது என்பதை இந்த இடுகை விளக்குகிறது. ஜாவாஸ்கிரிப்ட் பொத்தானின் வகுப்பிற்கான அணுகலை உங்களுக்கு வழங்கினாலும், iFrame API இன் சிக்கலானது போன்ற நேரடியான முறையைத் தடுக்கலாம் document.getElementsByClassName திட்டமிட்டபடி வேலை செய்வதிலிருந்து.

இந்தச் சிக்கலைத் தீர்க்க, API மற்றும் YouTube பிளேயர் நிலை நிகழ்வுகள் எவ்வாறு தொடர்பு கொள்கின்றன என்பதை நாம் புரிந்துகொள்ள வேண்டும். வீடியோ ஏற்றப்பட்ட உடனேயே உத்தேசிக்கப்பட்ட பொத்தான் கிளிக் செய்யப்படுவதற்கு உத்தரவாதம் அளிக்கும் வேறுபட்ட அணுகுமுறையை நாங்கள் காண்பிப்போம், இது உங்கள் இணையதளத்தில் பயன்படுத்த ஒரு செயல்பாட்டு மாதிரியை உங்களுக்கு வழங்குகிறது.

கட்டளை பயன்பாட்டின் உதாரணம்
MutationObserver YouTube iframe இன் DOM இல் செய்யப்பட்ட மாற்றங்களைக் கண்காணிக்கப் பயன்படுகிறது. பக்கத்தின் பிளேலிஸ்ட் பொத்தான் எப்போது அறிமுகப்படுத்தப்பட்டது என்பதைக் கண்டறிய இது பயனுள்ளதாக இருக்கும்.
observer.observe() புதிய குழந்தை உறுப்புகளைச் சேர்ப்பது போன்ற எந்த மாற்றங்களுக்கும் இலக்கு உறுப்பைக் கவனிக்கத் தொடங்குகிறது - இந்த விஷயத்தில், iframe இன் உடல்.
setTimeout() க்ளிக் செய்ய முயற்சிக்கும் முன் பிளேலிஸ்ட் மெனு பொத்தான் ரெண்டர் செய்ய, குறியீட்டை இயக்கும் முன் இடைநிறுத்தத்தைச் சேர்க்கிறது.
contentWindow.postMessage() யூடியூப் பிளேயரில் நிகழ்வுகளைத் தொடங்க குறுக்கு மூலத் தகவல்தொடர்புகளை செயல்படுத்துவதன் மூலம், பெற்றோர் சாளரத்தில் இருந்து iframe க்கு ஒரு செய்தியை அனுப்புகிறது.
YT.Player() ஐஃப்ரேமில் யூடியூப் பிளேயரை உட்பொதித்து, பிளேயரைக் கட்டுப்படுத்த ஏபிஐ முறைகளை வழங்குகிறது.
onYouTubeIframeAPIReady() YouTube iFrame API முடிந்தவுடன் தொடங்கும் ஒரு தானியங்கி முறை. நிகழ்வு கேட்பவர்களைச் சேர்க்க மற்றும் பிளேயரை உள்ளமைக்க இது அவசியம்.
querySelector() iframe இன் DOM க்குள் உள்ள துல்லியமான பொத்தான் உறுப்பைக் கண்டறியப் பயன்படுகிறது, தொடர்புகொள்வதற்கான சரியான பொருளைத் தேர்ந்தெடுக்கிறோம் என்பதை உறுதிசெய்யவும்.
firstScriptTag.parentNode.insertBefore() ஏற்கனவே உள்ள மற்றொரு ஸ்கிரிப்ட் குறிச்சொல்லுக்கு முன், DOM இல் YouTube iFrame API ஸ்கிரிப்ட் குறிச்சொல்லைச் செருகுவதன் மூலம் API சரியாக ஏற்றப்பட்டுள்ளதா என்பதை உறுதிப்படுத்துகிறது.
iframe.contentDocument iframe இன் ஆவணத்திற்கான அணுகலையும் அதன் DOM ஐ மாற்றும் திறனையும் எங்களுக்கு வழங்குவதன் மூலம் பிளேலிஸ்ட் மெனு பொத்தானைக் கண்டுபிடித்து வேலை செய்ய அனுமதிக்கிறது.

YouTube iFrame API பட்டன் ஆட்டோமேஷனைப் புரிந்துகொள்வது

மேலே குறிப்பிட்டுள்ள ஸ்கிரிப்ட்கள் சரிசெய்ய முயற்சிக்கும் ஒரு பொதுவான சிக்கல் YouTube iFrame இன் தானியங்கி "பிளேலிஸ்ட் மெனு பட்டன்" ஏற்றப்படும்போது கிளிக் செய்வதாகும். தி YouTube iFrame API இதற்குப் பயன்படுத்தப்படுகிறது, YouTube வீடியோக்களை உட்பொதித்தல் மற்றும் ஜாவாஸ்கிரிப்ட் மூலம் அவற்றின் செயல்களை நிர்வகிப்பதற்கான ஒரு வலுவான முறையை வழங்குகிறது. பிளேலிஸ்ட் மெனுவைத் திறப்பது போன்ற YouTube பிளேயரில் உள்ள பட்டனுடன் தொடர்பு கொள்ள விரும்பும்போது சிக்கல் ஏற்படுகிறது, ஆனால் iFrames மற்றும் API கட்டுப்பாடுகள் காரணமாக, YouTube பிளேயரின் DOM ஐ நேரடியாக அணுக முடியாது.

முதல் சிக்கலை தீர்க்க, ஏ பிறழ்வு கண்காணிப்பாளர் பயன்படுத்தப்படுகிறது. இந்த ஜாவாஸ்கிரிப்ட் செயல்பாடு, புதிய உறுப்புகளைச் சேர்ப்பது போன்ற DOM மாற்றங்களைக் கண்காணிக்கும் (பிளேலிஸ்ட் பொத்தான் போன்றவை). MutationObserver ஒரு iFrame இன் சூழலில் பிளேயர் மாற்றங்களைக் கண்காணிக்கிறது. DOM இல் ஏற்றப்பட்டவுடன் பொத்தான் உடனடியாக கிளிக் செய்யப்படும். உட்பொதிக்கப்பட்ட YouTube வீடியோக்கள் போன்ற டைனமிக் உள்ளடக்கத்துடன் பணிபுரியும் போது, ​​இந்த உத்தி மிகவும் உதவியாக இருக்கும், ஏனெனில் iFrame ஏற்றப்படும் போது சில அம்சங்கள் சரியான நேரத்தில் கிடைக்காமல் போகலாம்.

இரண்டாவது தீர்வில், நேரம் முடிந்தது அடிப்படை தாமதத்தை நிறுவ பயன்படுகிறது. இந்த முறையின் மூலம், முன்னரே தீர்மானிக்கப்பட்ட நேரம் (மில்லி விநாடிகளில் அளவிடப்படுகிறது) கடந்து செல்லும் வரை பொத்தான் கிளிக் செய்யப்படாது. iFrame-ல் உள்ள பொருள் ஏற்றப்படுவதற்கு எவ்வளவு நேரம் ஆகும் என்பது பற்றிய நல்ல யோசனை உங்களுக்கு இருக்கும்போது, ​​​​SetTimeout ஒரு எளிய மாற்றீட்டை வழங்குகிறது - இது MutationObserver போல நேர்த்தியாக இல்லாவிட்டாலும். உங்களுக்கு விரைவான திருத்தம் தேவைப்பட்டால் இந்த அணுகுமுறை நன்றாக வேலை செய்யும் மற்றும் பயனர் அனுபவத்தில் சிறிது பின்னடைவைப் பொருட்படுத்தாதீர்கள், குறிப்பாக நீங்கள் கிளிக் செய்ய விரும்பும் பொத்தான் காண்பிக்க சிறிது நேரம் எடுக்கும்.

மூன்றாவது முறை iFrame உடன் பெற்றோர் சாளரத்தில் இருந்து பேசுகிறது postMessage API. டொமைன்கள் முழுவதும் ஒத்துழைக்கும் போது இது மிகவும் முக்கியமானது, ஏனெனில் குறுக்கு மூல விதிகள் iFrame இல் நேரடி JavaScript கையாளுதலைத் தடுக்கலாம். YouTube iFrame ஆனது, ஒரு குறிப்பிட்ட செயலைச் செய்யச் சொல்லும் postMessage API மூலம் பெற்றோர் பக்கத்திலிருந்து ஒரு செய்தியைப் பெறுகிறது, அதாவது பிளேலிஸ்ட்டைத் திறப்பது. இந்த நுட்பம், உயர் மட்ட பாதுகாப்பையும் உலாவி பாதுகாப்பு அமைப்புகளுடன் இணக்கத்தையும் பராமரிக்கும் போது உட்பொதிக்கப்பட்ட பொருட்களுடன் மாறும் தொடர்புகளை அனுமதிக்கிறது.

தீர்வு 1: MutationObserver ஐப் பயன்படுத்தி YouTube பிளேலிஸ்ட் மெனு பட்டனை தானாக கிளிக் செய்யவும்

YouTube iFrame API மற்றும் JavaScript ஐப் பயன்படுத்தி, DOM மாற்றங்களைக் கண்டறிய MutationObserver பயன்படுகிறது.

// Load the YouTube iFrame API
var tag = document.createElement('script');
tag.src = 'https://www.youtube.com/iframe_api';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

// Initialize player
var player;
function onYouTubeIframeAPIReady() {
  player = new YT.Player('player_2', {
    events: {
      'onReady': onPlayerReady
    }
  });
}

// Wait for the player to be ready
function onPlayerReady(event) {
  document.getElementById('player_2').style.borderColor = '#FF6D00';

  // Set up a MutationObserver to detect DOM changes inside the iframe
  const iframeDoc = document.getElementById('player_2').contentDocument || document.getElementById('player_2').contentWindow.document;

  const observer = new MutationObserver((mutationsList) => {
    for (const mutation of mutationsList) {
      if (mutation.type === 'childList') {
        // Check if the button is present and clickable
        const playlistButton = iframeDoc.querySelector('.ytp-playlist-menu-button');
        if (playlistButton) {
          playlistButton.click();
          observer.disconnect(); // Stop observing after clicking
        }
      }
    }
  });

  // Start observing the iFrame for changes
  observer.observe(iframeDoc.body, { childList: true, subtree: true });
}

விருப்பம் 2: பிளேலிஸ்ட் மெனு பொத்தானைக் கிளிக் செய்வதைத் தாமதப்படுத்தவும்

கிளிக் செய்ய முயற்சிக்கும் முன் பொத்தான் கிடைக்கிறதா என்பதை உறுதிப்படுத்த, setTimeout உடன் JavaScript ஐப் பயன்படுத்தவும்.

// Load the YouTube iFrame API
var tag = document.createElement('script');
tag.src = 'https://www.youtube.com/iframe_api';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

// Initialize player
var player;
function onYouTubeIframeAPIReady() {
  player = new YT.Player('player_2', {
    events: {
      'onReady': onPlayerReady
    }
  });
}

// Click the playlist menu button after a delay
function onPlayerReady(event) {
  document.getElementById('player_2').style.borderColor = '#FF6D00';
  setTimeout(() => {
    const iframeDoc = document.getElementById('player_2').contentDocument || document.getElementById('player_2').contentWindow.document;
    const playlistButton = iframeDoc.querySelector('.ytp-playlist-menu-button');
    if (playlistButton) {
      playlistButton.click();
    }
  }, 3000); // Adjust delay as necessary
}

தீர்வு 3: கிராஸ்-டொமைன் கம்யூனிகேஷனுக்கு postMessage API ஐப் பயன்படுத்துதல்

JavaScript ஆனது postMessage API வழியாக வேறொரு டொமைனிலிருந்து iframe உடன் தொடர்பு கொள்கிறது

// Load the YouTube iFrame API
var tag = document.createElement('script');
tag.src = 'https://www.youtube.com/iframe_api';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

// Initialize player
var player;
function onYouTubeIframeAPIReady() {
  player = new YT.Player('player_2', {
    events: {
      'onReady': onPlayerReady
    }
  });
}

// Use postMessage to send a message to the iframe
function onPlayerReady(event) {
  document.getElementById('player_2').style.borderColor = '#FF6D00';

  // Send a message to the iframe
  var iframe = document.getElementById('player_2');
  iframe.contentWindow.postMessage('{ "event": "command", "func": "openPlaylist" }', '*');
}

சிறந்த பயனர் தொடர்புக்காக YouTube iFrame API கட்டுப்பாட்டை மேம்படுத்துகிறது

உடன் பணிபுரிகிறது YouTube iFrame API உட்பொதிக்கப்பட்ட பிளேயர் மீது அதிநவீன கட்டுப்பாட்டை வழங்குகிறது என்பதையும் கணக்கில் எடுத்துக்கொள்ள வேண்டும். எடுத்துக்காட்டாக, "பிளேலிஸ்ட் மெனு பட்டன்" போன்ற பொத்தான்களைத் தட்டுவதுடன், நீங்கள் இடையகப்படுத்தல் அல்லது பிளேபேக் சிக்கல்கள் போன்ற பிற நிகழ்வுகளை அணுகலாம் மற்றும் பிளேயரின் நிலையை மாற்றலாம் (ப்ளே, இடைநிறுத்தம், நிறுத்து). மென்மையான மற்றும் ஊடாடும் பயனர் அனுபவத்தை உருவாக்க விரும்பும் டெவலப்பர்களுக்கு, இந்த அம்சங்கள் அவசியம். API என்பது வலைத்தளங்களில் வீடியோ உள்ளடக்கத்தை நிர்வகிப்பதற்கான ஒரு பல்துறை கருவியாகும், ஏனெனில் இது பல்வேறு வீடியோக்கள் அல்லது பிளேலிஸ்ட்களின் மாறும் செருகலையும் செயல்படுத்துகிறது.

பயன்படுத்தும் திறன் மாநில மாற்றம் நிகழ்வு ஒரு முக்கிய அம்சமாகும். பிளேயரின் நிலை மாறும்போது-உதாரணமாக, வீடியோ இயங்கத் தொடங்கும் போது அல்லது பயனர் வீடியோவை இடைநிறுத்தும்போது-இந்த நிகழ்வு கேட்பவர் செயல்படுத்தப்படும். ஒரு திரைப்படம் தவிர்க்கப்படும்போது அல்லது இடைநிறுத்தப்படும்போது இலக்கு செய்திகள் அல்லது விளம்பரங்களைக் காண்பிப்பது போன்ற தனிப்பயன் நடத்தைகளைச் செய்ய டெவலப்பர்கள் இந்த நிகழ்வைப் பயன்படுத்தலாம். iFrame API ஆனது, புதிய வீடியோ இயங்கத் தொடங்கும் போது, ​​விளக்கம் அல்லது தொடர்புடைய உள்ளடக்கத்தை வழங்குவது போன்ற ஒத்திசைக்கப்பட்ட செயல்களை உருவாக்க, பிற இணையதள உறுப்புகளுடன் தொடர்பு கொள்ளலாம்.

கூடுதலாக, API போன்ற அளவுருக்களைப் பயன்படுத்தி பிளேபேக்கைக் கட்டுப்படுத்த உங்களை அனுமதிக்கிறது பிளேயர் வார்ஸ். அதாவது, ஒரு குறிப்பிட்ட நேரத்தில் தானாக இயங்கத் தொடங்கும் அல்லது தொடர்ந்து சுழலும் வீடியோவை நீங்கள் உட்பொதிக்கலாம். யூடியூப் பிளேலிஸ்ட்களை உட்பொதிக்க இந்த அமைப்புகள் குறிப்பாக உதவியாக இருக்கும், ஏனெனில் அவை பிளேயரின் நடத்தையை முன்கூட்டியே அமைப்பதன் மூலம் பயனரின் அனுபவத்தை எளிதாக்குகின்றன. இந்த அதிநவீன பண்புக்கூறுகளைப் புரிந்துகொள்வது மற்றும் அவற்றை DOM கையாளுதல் முறைகளுடன் இணைப்பது, வலைப்பக்கத்திற்கும் யூடியூப் வீடியோக்களுக்கும் இடையே உள்ள இடைவெளியை முழுவதுமாகத் தனிப்பயனாக்க டெவலப்பர்களை விரிவான கருவிகளுடன் சித்தப்படுத்துகிறது.

YouTube iFrame செயல்களை தானியக்கமாக்குவது பற்றிய பொதுவான கேள்விகள்

  1. YouTube iFrame இல் செயல்களை எவ்வாறு தூண்டுவது?
  2. பயன்படுத்தி MutationObserver அல்லது setTimeout முறைகள், யூடியூப் iFrame இல் உள்ள பொத்தான்களை அழுத்துவது போன்ற செயல்பாடுகளைச் செய்ய, உறுப்பை ஏற்றுவதற்கு முன் அதைக் கண்டறியலாம் அல்லது காத்திருக்கலாம்.
  3. YouTube iFrame APIஐப் பயன்படுத்தி வீடியோக்கள் இயங்கும் விதத்தை மாற்ற முடியுமா?
  4. ஆம், பிளே, இடைநிறுத்தம் மற்றும் நிறுத்துதல் போன்ற பின்னணி செயல்களைக் கட்டுப்படுத்த JavaScript ஐப் பயன்படுத்தலாம் YT.Player() செயல்பாடு.
  5. onStateChange நிகழ்வின் நோக்கம் என்ன?
  6. வீடியோ தொடங்கும் போது, ​​நிறுத்தப்படும் அல்லது இடைநிறுத்தப்படும் போது, ​​பிளேயரின் நிலை மாற்றங்களைக் கண்காணிக்க முடியும் onStateChange நிகழ்வு கேட்பவர். இந்த மாற்றங்களின் அடிப்படையில், தனிப்பயன் செயல்பாடுகளைத் தொடங்க இது பயன்படுத்தப்படலாம்.
  7. YouTube iFrames இல் உள்ள பட்டன்களுக்கு document.getElementsByClassName() ஏன் வேலை செய்யாது?
  8. பயன்படுத்தி பொருட்களை அணுகுதல் document.getElementsByClassName() குறுக்கு மூலக் கட்டுப்பாடுகள் மற்றும் iFrame இல் உள்ள டைனமிக் உள்ளடக்க ஏற்றம் காரணமாக செயல்படாமல் இருக்கலாம். iFrame உள்ளடக்கத்துடன் தொடர்பு கொள்ள, அதற்குப் பதிலாக MutationObserver அல்லது postMessage ஐப் பயன்படுத்தவும்.
  9. YouTube iFrame API இல் playerVarகள் என்றால் என்ன?
  10. தானாக இயக்குதல், லூப்பிங் செய்தல் மற்றும் குறிப்பிட்ட நேரத்தில் தொடங்குதல் உள்ளிட்ட பல வீடியோ பிளேபேக் பண்புகளை நீங்கள் சரிசெய்யலாம். playerVars.

YouTube iFrame பொத்தான்களை தானியக்கமாக்குவது பற்றிய இறுதி எண்ணங்கள்

iFrame API ஆனது உட்பொதிக்கப்பட்ட YouTube பிளேலிஸ்ட்களுடன் தொடர்புகளை தானியங்குபடுத்த பயன்படுகிறது, இது பயனர் அனுபவத்தை கணிசமாக மேம்படுத்தும். குறுக்கு மூலக் கட்டுப்பாடுகள் காரணமாக, பிரபலமான முறைகள் எப்போதும் செயல்படாமல் போகலாம், இருப்பினும் உத்திகள் போன்றவை நேரம் முடிந்தது மற்றும் பிறழ்வு கண்காணிப்பாளர் பக்கம் ஏற்றப்படும்போது பிளேலிஸ்ட் பொத்தானை அழுத்துவதற்கு நம்பகமான மாற்றுகளை வழங்கவும்.

YouTube iFrame API இன் அம்சங்களை முழுமையாகப் புரிந்துகொள்வதன் மூலம், நீங்கள் மிகவும் பதிலளிக்கக்கூடிய மற்றும் ஊடாடக்கூடிய இணையதளத்தை உருவாக்க முடியும். டெவலப்பர்களுக்கு பிளேயர் நிகழ்வுகள் மற்றும் அதிநவீன கட்டுப்பாடுகளுக்கான அணுகலை வழங்குவதன் மூலம், அவர்கள் தங்கள் உள்ளடக்கத்தின் நடத்தைக்கு ஏற்றவாறு, சுமூகமான ஒருங்கிணைப்பு மற்றும் அதிகரித்த பயனர் ஈடுபாட்டிற்கு உத்தரவாதம் அளிக்க முடியும்.

YouTube iFrame ஆட்டோமேஷனுக்கான ஆதாரங்கள் மற்றும் குறிப்புகள்
  1. YouTube iFrame API ஆவணங்கள் மற்றும் உட்பொதிக்கப்பட்ட வீடியோ பிளேயர்களுடன் டெவலப்பர்கள் எவ்வாறு தொடர்புகொள்வதற்கு இது உதவுகிறது என்பதை விவரிக்கிறது. அதைப் பற்றி நீங்கள் இங்கே மேலும் காணலாம்: YouTube iFrame API .
  2. இந்த வழிகாட்டியில் விளக்கப்பட்டுள்ளபடி, DOM மாற்றங்களைக் கண்காணிக்கவும் எதிர்வினையாற்றவும் JavaScript இல் MutationObserver இன் பயன்பாட்டை ஆராய்கிறது: MDN வெப் டாக்ஸ் - MutationObserver .
  3. அனைத்து டொமைன்களிலும் iFrame இல் உள்ள உள்ளடக்கத்துடன் தொடர்புகொள்வதற்கு இன்றியமையாத, postMessage ஐப் பயன்படுத்தி கிராஸ்-ஆரிஜின் தகவல்தொடர்பு பற்றிய நுண்ணறிவுகளை வழங்குகிறது: MDN Web Docs - postMessage API .