很长一段时间以来,我一直试图弄清楚这个问题。我正在根据规范创建 VPAID 脚本来支持基本的 VPAID 功能。
要显示广告,我将使用 initAd 参数中提供的插槽,并在我的视频播放器 (PlayerJS) 中附加一个 iFrame 以显示广告(必须使用自己的播放器进行第三方事件跟踪等)。如果插槽没有被 display CSS 属性隐藏或者它的容器没有隐藏,那么一切都运行良好。当它被隐藏时,浏览器不会让 iframe dom 用 js 渲染,所以播放器没有启动。
initAd(width, height, viewMode, desiredBitrate, creativeData, environmentVars) {
this._attributes.width = width
this._attributes.height = height
this._attributes.viewMode = viewMode
this._attributes.desiredBitrate = desiredBitrate
this._slot = environmentVars.slot || this.this.emit('AdError', 'Slot is invalid')
this._slotWnd = function(a) {
a = a.ownerDocument
return a.defaultView || a.parentWindow
}(this._slot)
this._videoSlot = environmentVars.videoSlot || this.this.emit('AdError', 'Video slot is invalid')
try {
this.adParameters = JSON.parse(creativeData.AdParameters)
} catch (e) {
console.error('Error parsing AdParameters')
console.log(e)
}
this._slotWnd.addEventListener('message', (event) => { this.eventHandler(event, this) })
this._player = new PlayerFrameIniter(this._slot, this._slotWnd, false, true)
this._player.init( () => this.emit('AdLoaded') )
}
在 PlayerFrameIniter 我正在创建一个像这样的 iframe:
createIframe(container, url, onFrameLoaded) {
this._frame = this._context.document.createElement('iframe')
const style = {
width: '100%',
height: '100%',
border: 0,
position: 'absolute',
overflow: 'hidden'
}
Object.assign(this._frame.style, style)
this._frame.src = url
this._frame.onload = onFrameLoaded
container.appendChild(this._frame)
}
如何使插槽内的框架正确渲染,或者此任务可能有不同的方法?