/**
* @file resize-manager.js
*/
從“全局/窗口”導入窗口;
從'./utils/fn.js'導入{debounce};
import * as Events from './utils/events.js';
從 './utils/merge-options.js' 導入 mergeOptions;
從 './component.js' 導入組件;
/**
* 調整大小管理器。它負責在適當的條件下觸發播放器上的“playerresize”。
*
* 它將創建一個 iframe 並在其上使用去抖動調整大小處理程序或使用新的 {@link https://wicg.github.io/ResizeObserver/|ResizeObserver}。
*
* 如果 ResizeObserver 本機可用,則將使用它。可以將聚合填充作為選項傳入。
* 如果不需要 `playerresize` 事件,可以從播放器中刪除 ResizeManager 組件,請參見下面的示例。
* @example <caption>如何禁用調整大小管理器</caption>
* const player = videojs('#vid', {
* 調整大小管理器:假
* });
*
* @see {@link https://wicg.github.io/ResizeObserver/|ResizeObserver 規範}
*
* @extends 組件
*/
類 ResizeManager 擴展組件 {
/**
* 創建調整大小管理器。
*
* @param {Object} 播放器
* 此類應附加到的 `Player`。
*
* @param {對象} [選項]
* ResizeManager 選項的鍵/值存儲。
*
* @param {Object} [options.ResizeObserver]
* 這裡可以傳入一個 ResizeObserver 的 polyfill。
* 如果將其設置為 null,它將忽略本機 ResizeObserver 並回退到 iframe 回退。
*/
構造函數(播放器,選項){
讓 RESIZE_OBSERVER_AVAILABLE = options.ResizeObserver ||窗口.ResizeObserver;
// 如果傳遞了 `null`,我們要禁用 ResizeObserver
如果(選項。ResizeObserver === null){
RESIZE_OBSERVER_AVAILABLE = false;
}
// 只有當 ResizeObserver 不可用時才創建一個元素
const options_ = mergeOptions({
創意月光:!可調整觀察伺服器的大小,
reportTouchActivity:假
}, 選項);
超級(玩家,選項_);
this.ResizeObserver = options.ResizeObserver ||窗口.ResizeObserver;
this.loadListener_ = null;
this.resizeObserver_ = null;
this.debouncedHandler_ = debounce(() => {
這個.resizeHandler();
}, 100, 假的, 這個);
如果(RESIZE_OBSERVER_AVAILABLE){
this.resizeObserver_ = new this.ResizeObserver(this.debouncedHandler_);
this.resizeObserver_.observe(player.el());
}其他{
this.loadListener_ = () => {
如果(!this.el_ || !this.el_.contentWindow){
返回;
}
const debouncedHandler_ = this.debouncedHandler_;
讓 unloadListener_ = this.unloadListener_ = function() {
Events.off(this, 'resize', debouncedHandler_);
Events.off(this, 'unload', unloadListener_);
unloadListener_ = null;
};
// safari 和 edge 可以在 resizemanager dispose 之前卸載 iframe
// 我們必須在此之前正確處理事件處理程序
Events.on(this.el_.contentWindow, 'unload', unloadListener_);
Events.on(this.el_.contentWindow, 'resize', debouncedHandler_);
};
this.one('load', this.loadListener_);
}
}
創建El() {
返回 super.createEl('iframe', {
className: 'vjs-resize-manager',
選項卡索引:-1,
title: this.localize('無內容')
},{
'aria-hidden': 'true'
});
}
/**
* 當在 iframe 上觸發調整大小時或通過 ResizeObserver 觀察到調整大小時調用
*
* @fires Player#playerresize
*/
調整大小處理程序(){
/**
* 當播放器大小改變時調用
*
* @event Player#playerresize
* @type {EventTarget~Event}
*/
// 確保玩家還在附近觸發
// 防止這在處理後導致錯誤
如果(!this.player_ || !this.player_.trigger){
返回;
}
this.player_.trigger('playerresize');
}
處置(){
如果(this.debouncedHandler_){
this.debouncedHandler_.cancel();
}
如果(this.resizeObserver_){
如果 (this.player_.el()) {
this.resizeObserver_.unobserve(this.player_.el());
}
this.resizeObserver_.disconnect();
}
如果(this.loadListener_){
this.off('load', this.loadListener_);
}
如果(this.el_ && this.el_.contentWindow && this.unloadListener_){
this.unloadListener_.call(this.el_.contentWindow);
}
this.ResizeObserver = null;
this.resizeObserver = null;
this.debouncedHandler_ = null;
this.loadListener_ = null;
super.dispose();
}
}
Component.registerComponent('ResizeManager', ResizeManager);
導出默認 ResizeManager;