Games के लिए iframe embedding की best practices
कई platforms (Itch.io, Newgrounds, Cinevva, आपकी अपनी site) games को iframes में embed करती हैं। यह tutorial बताता है कि embed होने पर आपका game अच्छे से कैसे काम करे।
1) बुनियादी embeddable setup
आपके game को पूरी page का control लिए बिना काम करना चाहिए:
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
* { margin: 0; padding: 0; }
html, body { width: 100%; height: 100%; overflow: hidden; }
canvas { display: block; width: 100%; height: 100%; }
</style>
</head>
<body>
<canvas id="game"></canvas>
<script src="game.js"></script>
</body>
</html>2) iframe context का पता लगाना
js
const isEmbedded = window.self !== window.top
if (isEmbedded) {
// Adjust behavior for embedded context
hideExternalLinks()
adjustUIForSmallSize()
}
function hideExternalLinks() {
document.querySelectorAll('a[target="_blank"]').forEach(link => {
link.style.display = 'none'
})
}3) ज़रूरी iframe permissions allow करें
parent page तय करती है कि आपका iframe क्या कर सकता है। आम permissions:
html
<iframe
src="https://game.example.com"
allow="fullscreen; autoplay; gamepad; pointer-lock"
sandbox="allow-scripts allow-same-origin allow-pointer-lock allow-popups"
></iframe>आपके game को missing permissions को सलीके से handle करना चाहिए:
js
// Check if fullscreen is available
const canFullscreen = document.fullscreenEnabled || document.webkitFullscreenEnabled
if (!canFullscreen) {
document.getElementById('fullscreen-btn').style.display = 'none'
}4) iframe से fullscreen
fullscreen के लिए allow="fullscreen" attribute ज़रूरी है:
js
async function requestFullscreen() {
const elem = document.documentElement
try {
if (elem.requestFullscreen) {
await elem.requestFullscreen()
} else if (elem.webkitRequestFullscreen) {
await elem.webkitRequestFullscreen()
}
} catch (err) {
// Fullscreen not allowed - show message
showMessage('Fullscreen not available when embedded')
}
}5) parent page से communication
safe cross-origin communication के लिए postMessage का इस्तेमाल करें:
आपके game में:
js
// Send message to parent
function notifyParent(type, data) {
if (window.parent !== window) {
window.parent.postMessage({ type, data, source: 'game' }, '*')
}
}
// Receive messages from parent
window.addEventListener('message', (event) => {
// Validate origin if needed
// if (event.origin !== 'https://trusted-host.com') return
const { type, data } = event.data
switch (type) {
case 'pause':
pauseGame()
break
case 'resume':
resumeGame()
break
case 'setVolume':
setVolume(data.volume)
break
}
})
// Notify when game is ready
window.addEventListener('load', () => {
notifyParent('ready', { width: 800, height: 600 })
})
// Notify on game events
function onGameOver(score) {
notifyParent('gameover', { score })
}parent page में:
js
const iframe = document.getElementById('game-iframe')
iframe.addEventListener('load', () => {
// Listen for messages from game
window.addEventListener('message', (event) => {
if (event.source !== iframe.contentWindow) return
if (event.data.source !== 'game') return
const { type, data } = event.data
if (type === 'ready') {
console.log('Game ready:', data)
}
if (type === 'gameover') {
showScoreModal(data.score)
}
})
})
// Send commands to game
function pauseGame() {
iframe.contentWindow.postMessage({ type: 'pause' }, '*')
}6) focus संभालना
iframes focus खो सकते हैं, जिससे keyboard input टूट जाता है:
js
// Auto-focus canvas when clicked
canvas.addEventListener('click', () => {
canvas.focus()
})
// Make canvas focusable
canvas.tabIndex = 1
// Handle focus loss
window.addEventListener('blur', () => {
// Reset held keys
input.left = input.right = input.up = input.down = false
if (isEmbedded) {
// Optionally pause
// pauseGame()
}
})
// Request focus from parent
function requestFocus() {
notifyParent('requestFocus', {})
}7) responsive embedded size
अलग-अलग embed dimensions को handle करें:
js
function handleResize() {
const width = window.innerWidth
const height = window.innerHeight
// Adjust UI based on size
if (width < 400 || height < 300) {
enableCompactUI()
} else {
enableFullUI()
}
// Scale game appropriately
resizeCanvas(width, height)
}
window.addEventListener('resize', handleResize)
handleResize()8) embeds के लिए loading indicator
तुरंत कुछ न कुछ दिखाएँ:
js
// Inline in HTML for instant display
const loadingHTML = `
<div id="loading" style="
position: fixed;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
background: #1a1a2e;
color: #fff;
font-family: sans-serif;
">
<div>
<div class="spinner"></div>
<p>Loading...</p>
</div>
</div>
`
// Remove when game is ready
function hideLoading() {
const loading = document.getElementById('loading')
if (loading) {
loading.style.opacity = '0'
loading.style.transition = 'opacity 0.3s'
setTimeout(() => loading.remove(), 300)
}
}9) platform-specific SDKs
कुछ platforms के अपने APIs होते हैं:
Itch.io:
js
// No SDK required, but can use postMessage for achievements
window.parent.postMessage({ type: 'itch-achievement', data: { id: 'first-win' }}, '*')Newgrounds:
js
// Include Newgrounds.io SDK
const ngio = new Newgrounds.io.core('APP_ID', 'AES_KEY')
ngio.callComponent('Medal.unlock', { id: 12345 })Cinevva:
js
// Signal game is ready
window.parent.postMessage({ type: 'cinevva:ready' }, '*')
// Signal playable state
window.parent.postMessage({ type: 'cinevva:playable' }, '*')10) security से जुड़ी बातें
js
// Validate message origins when sensitive
window.addEventListener('message', (event) => {
const trustedOrigins = [
'https://itch.io',
'https://cinevva.com',
'https://yoursite.com'
]
if (!trustedOrigins.includes(event.origin)) {
return // Ignore untrusted messages
}
// Process message...
})
// Don't expose sensitive operations via postMessage
// Only allow whitelisted commands
const allowedCommands = ['pause', 'resume', 'setVolume', 'mute']
window.addEventListener('message', (event) => {
const { type } = event.data
if (!allowedCommands.includes(type)) return
// Handle command...
})Testing checklist
- Local testing: एक साधारण HTTP server इस्तेमाल करें,
file://नहीं - Cross-origin: असली iframe embedding के साथ test करें
- Permissions: restricted sandbox के साथ test करें
- Focus: iframe के बाहर click करने के बाद keyboard test करें
- Resize: अलग-अलग embed sizes पर test करें
- Mobile: embedded context में touch test करें
html
<!-- Test embed page -->
<!DOCTYPE html>
<html>
<body style="background: #333; padding: 20px;">
<h1 style="color: #fff;">Embed Test</h1>
<iframe
src="http://localhost:8000"
width="800"
height="600"
allow="fullscreen; autoplay; gamepad"
></iframe>
</body>
</html>मिलते-जुलते लेख
- तेज़ लोड होने वाला web game ship करें
- Mobile-friendly web games
- creators के लिए
- COOP/COEP और SharedArrayBuffer — cross-origin headers जो iframe embedding को प्रभावित करते हैं
- अपना game itch.io पर कैसे launch करें — itch.io browser games को natively iframes में embed करती है
External Resources
- MDN: iframe element — iframe attributes का पूरा reference
- MDN: Permissions Policy — iframes कौन-से features इस्तेमाल कर सकते हैं, यह control करना
- MDN: postMessage API — iframe और parent के बीच communication