Middle
Ինչպե՞ս է տեղի ունենում տվյալների փոխանակումը iframe և հիմնական էջի միջև։
sobes.tech AI
Պատասխան AI-ից
Կան մի քանի մեթոդներ տվյալների փոխանակման համար:
-
PostMessage API:
- հիմնական և անվտանգ միջոց:
- թույլ է տալիս ուղարկել հաղորդագրություններ պատուհանների միջև (iframe/հորինական, տարբեր դոմեններ)
- կարևոր է նշել սպասվող
origin, որպեսզի կանխել XSS հարձակումները:
// Ուղարկում հորինական պատուհանից iframe-ին const iframeEl = document.getElementById('my-iframe'); iframeEl.contentWindow.postMessage('Բարև հորից!', 'https://trusted-domain.com'); // Ստացվում է iframe-ում window.addEventListener('message', function(event) { if (event.origin !== 'https://parent-domain.com') { return; // Ստուգում ուղարկողին } console.log('Ստացված հաղորդագրություն iframe-ում:', event.data); }); // Ուղարկում iframe-ից հորինական պատուհանին window.parent.postMessage('Բարև iframe-ից!', 'https://parent-domain.com'); // Ստացվում է հորինական պատուհանում window.addEventListener('message', function(event) { if (event.origin !== 'https://iframe-domain.com') { return; // Ստուգում ուղարկողին } console.log('Ստացված հաղորդագրություն հորից:', event.data); }); -
Ճանապարհ դեպի
windowօբյեկտ (միայն Same-Origin համար):- Եթե iframe-ն և հորինական էջը նույն դոմենում են (Same-Origin Policy), նրանք կարող են ուղղակիորեն մուտք ունենալ միմյանց
windowօբյեկտները:
// Հորինական պատուհանում const iframeEl = document.getElementById('my-iframe'); const iframeWindow = iframeEl.contentWindow; iframeWindow.someVariable = 'Արժեք հորից'; iframeWindow.someFunction(); // iframe-ում const parentWindow = window.parent; console.log(parentWindow.someVariable); parentWindow.someOtherFunction(); - Եթե iframe-ն և հորինական էջը նույն դոմենում են (Same-Origin Policy), նրանք կարող են ուղղակիորեն մուտք ունենալ միմյանց
-
URL hash (
#):- պարզ, բայց սահմանափակ միջոց:
- կարող է փոխանցել փոքր տվյալներ, փոփոխելով hash-ը iframe-ի URL-ում
- փոփոխությունները hash-ը չեն թարմացնում էջը
- պահանջում է հետևել hash-ի փոփոխությանը (օրինակ,
hashchangeիրադարձության միջոցով)
// Հորինական պատուհանում՝ hash-ը փոխելու համար const iframeEl = document.getElementById('my-iframe'); iframeEl.contentWindow.location.hash = 'data=մեկ_արժեք'; // iframe-ում՝ hash-ը կարդալու համար window.addEventListener('hashchange', function() { const hash = window.location.hash; console.log('Hash փոխվեց:', hash); // տվյալների վերլուծում hash-ից }); -
location.hrefփոփոխություն (պակաս առաջարկվող):- տվյալների փոխանցում URL-ի փոփոխությամբ և կրկնակի բեռնումով
- չի հարմար հաճախակի փոխանակման համար
-
Կիսվող պահոցներ (Same-Origin):
localStorageևsessionStorage- եթե iframe-ն և հորինական էջը նույն դոմենում են, կարող են օգտագործել նույն պահոցները
// Հորինական պատուհանում localStorage.setItem('sharedData', JSON.stringify({ value: 'Օրինակ' })); // iframe-ում const data = JSON.parse(localStorage.getItem('sharedData')); console.log('Տվյալներ localStorage-ից:', data);
Ընտրությունը կախված է անվտանգության քաղաքականությունից (Same-Origin Policy) և փոխանցվող տվյալների ծավալից/տիպից: PostMessage-ը առավել ճկուն և անվտանգ լուծում է տարբեր դոմենների միջև տվյալների փոխանակման համար։