UNPKG

xgplayer

Version:
428 lines (427 loc) • 14.1 kB
import { inherits as _inherits, createSuper as _createSuper, classCallCheck as _classCallCheck, defineProperty as _defineProperty, assertThisInitialized as _assertThisInitialized, createClass as _createClass, objectSpread2 as _objectSpread2 } from "../../_virtual/_rollupPluginBabelHelpers.js"; import util from "../../utils/util.js"; import { SHORTCUT } from "../../events.js"; import BasePlugin from "../../plugin/basePlugin.js"; import "delegate"; function preventDefault(e) { e.preventDefault(); e.returnValue = false; } function isDisableTag(el) { var tagName = el.tagName; if (tagName === "INPUT" || tagName === "TEXTAREA" || el.isContentEditable) { return true; } return false; } var Keyboard = /* @__PURE__ */ function(_BasePlugin) { _inherits(Keyboard2, _BasePlugin); var _super = _createSuper(Keyboard2); function Keyboard2() { var _this; _classCallCheck(this, Keyboard2); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); _defineProperty(_assertThisInitialized(_this), "onBodyKeyDown", function(event) { if (!_this.player) { return; } var e = event || window.event; var keyCode = e.keyCode; var _assertThisInitialize = _assertThisInitialized(_this), _keyState = _assertThisInitialize._keyState, player = _assertThisInitialize.player; var _this$config = _this.config, disable = _this$config.disable, disableBodyTrigger = _this$config.disableBodyTrigger, isIgnoreUserActive = _this$config.isIgnoreUserActive; if (disable || disableBodyTrigger || !(player.isUserActive || isIgnoreUserActive) || isDisableTag(e.target) || !_this.checkIsVisible() || e.metaKey || e.altKey || e.ctrlKey) { _keyState.isBodyKeyDown = false; return; } if (!event.repeat && !_keyState.isKeyDown) { if ((e.target === document.body || _this.config.isGlobalTrigger && !isDisableTag(e.target)) && _this.checkCode(keyCode, true)) { _keyState.isBodyKeyDown = true; } document.addEventListener("keyup", _this.onBodyKeyUp); } _keyState.isBodyKeyDown && _this.handleKeyDown(e); }); _defineProperty(_assertThisInitialized(_this), "onBodyKeyUp", function(event) { if (!_this.player) { return; } document.removeEventListener("keyup", _this.onBodyKeyUp); _this.handleKeyUp(event); }); _defineProperty(_assertThisInitialized(_this), "onKeydown", function(event) { if (!_this.player) { return; } var e = event || window.event; var _assertThisInitialize2 = _assertThisInitialized(_this), _keyState = _assertThisInitialize2._keyState; if (!e.repeat) { if (_this.config.disable || _this.config.disableRootTrigger || e.metaKey || e.altKey || e.ctrlKey) { return; } if (e && (e.keyCode === 37 || _this.checkCode(e.keyCode)) && (e.target === _this.player.root || e.target === _this.player.video || e.target === _this.player.controls.el)) { _keyState.isKeyDown = true; } _this.player.root.addEventListener("keyup", _this.onKeyup); } if (!_keyState.isKeyDown) { return; } _this.handleKeyDown(e); }); _defineProperty(_assertThisInitialized(_this), "onKeyup", function(event) { if (!_this.player) { return; } _this.player.root.removeEventListener("keyup", _this.onKeyup); _this.handleKeyUp(event); }); return _this; } _createClass(Keyboard2, [{ key: "mergekeyCodeMap", value: function mergekeyCodeMap() { var _this2 = this; var extendkeyCodeMap = this.config.keyCodeMap; if (extendkeyCodeMap) { Object.keys(extendkeyCodeMap).map(function(key) { if (!_this2.keyCodeMap[key]) { _this2.keyCodeMap[key] = extendkeyCodeMap[key]; } else { ["keyCode", "action", "disable", "pressAction", "disablePress", "isBodyTarget"].map(function(key1) { extendkeyCodeMap[key][key1] && (_this2.keyCodeMap[key][key1] = extendkeyCodeMap[key][key1]); }); } }); } } }, { key: "afterCreate", value: function afterCreate() { this.config.disable = !this.playerConfig.keyShortcut; var seekStep = typeof this.config.seekStep === "function" ? this.config.seekStep(this.player) : this.config.seekStep; if (!(!seekStep || typeof seekStep !== "number")) { this.seekStep = seekStep; } this.keyCodeMap = { space: { keyCode: 32, action: "playPause", disable: false, disablePress: false, noBodyTarget: false }, up: { keyCode: 38, action: "upVolume", disable: false, disablePress: false, noBodyTarget: true }, down: { keyCode: 40, action: "downVolume", disable: false, disablePress: false, noBodyTarget: true }, left: { keyCode: 37, action: "seekBack", disablePress: false, disable: false }, right: { keyCode: 39, action: "seek", pressAction: "changePlaybackRate", disablePress: false, disable: false }, esc: { keyCode: 27, action: "exitFullscreen", disablePress: true, disable: false } }; this.mergekeyCodeMap(); this._keyState = { isKeyDown: false, isBodyKeyDown: false, isPress: false, tt: 0, playbackRate: 0 }; this.player.root.addEventListener("keydown", this.onKeydown); document.addEventListener("keydown", this.onBodyKeyDown); } }, { key: "setConfig", value: function setConfig(newConfig) { var _this3 = this; Object.keys(newConfig).forEach(function(key) { _this3.config[key] = newConfig[key]; }); } }, { key: "checkIsVisible", value: function checkIsVisible() { if (!this.config.checkVisible) { return true; } var rec = this.player.root.getBoundingClientRect(); var height = rec.height, top = rec.top, bottom = rec.bottom; var h = window.innerHeight; if (top < 0 && top < 0 - height * 0.9 || bottom > 0 && bottom - h > height * 0.9) { return false; } return true; } }, { key: "checkCode", value: function checkCode(code, isBodyTarget) { var _this4 = this; var flag = false; Object.keys(this.keyCodeMap).map(function(key) { if (_this4.keyCodeMap[key] && code === _this4.keyCodeMap[key].keyCode && !_this4.keyCodeMap[key].disable) { flag = !isBodyTarget || isBodyTarget && !_this4.keyCodeMap[key].noBodyTarget; } }); return flag; } }, { key: "downVolume", value: function downVolume(event) { var player = this.player; if (player.volume <= 0) { return; } var val = parseFloat((player.volume - 0.1).toFixed(1)); var props = { volume: { from: player.volume, to: val } }; this.emitUserAction(event, "change_volume", { props }); if (val >= 0) { player.volume = val; } else { player.volume = 0; } } }, { key: "upVolume", value: function upVolume(event) { var player = this.player; if (player.volume >= 1) { return; } var val = parseFloat((player.volume + 0.1).toFixed(1)); var props = { volume: { from: player.volume, to: val } }; this.emitUserAction(event, "change_volume", { props }); if (val <= 1) { player.volume = val; } else { player.volume = 1; } } }, { key: "seek", value: function seek(event) { var _this$player = this.player, currentTime = _this$player.currentTime, offsetCurrentTime = _this$player.offsetCurrentTime, duration = _this$player.duration, offsetDuration = _this$player.offsetDuration, timeSegments = _this$player.timeSegments; var _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime; var _duration = offsetDuration || duration; var _step = event.repeat && this.seekStep >= 4 ? parseInt(this.seekStep / 2, 10) : this.seekStep; if (_time + _step <= _duration) { _time = _time + _step; } else { _time = _duration; } var _seekTime = util.getCurrentTimeByOffset(_time, timeSegments); var props = { currentTime: { from: currentTime, to: _seekTime } }; this.emitUserAction(event, "seek", { props }); this.player.currentTime = _seekTime; } }, { key: "seekBack", value: function seekBack(event) { var _this$player2 = this.player, currentTime = _this$player2.currentTime, offsetCurrentTime = _this$player2.offsetCurrentTime, timeSegments = _this$player2.timeSegments; var _step = event.repeat ? parseInt(this.seekStep / 2, 10) : this.seekStep; var _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime; var _seekTime = _time - _step; if (_seekTime < 0) { _seekTime = 0; } _seekTime = util.getCurrentTimeByOffset(_seekTime, timeSegments); var props = { currentTime: { from: currentTime, to: _seekTime } }; this.emitUserAction(event, "seek", { props }); this.player.currentTime = _seekTime; } }, { key: "changePlaybackRate", value: function changePlaybackRate(event) { var _keyState = this._keyState, config = this.config, player = this.player; if (_keyState.playbackRate === 0) { _keyState.playbackRate = player.playbackRate; player.playbackRate = config.playbackRate; } } }, { key: "playPause", value: function playPause(event) { var player = this.player; if (!player) { return; } this.emitUserAction(event, "switch_play_pause"); if (player.paused) { player.play(); } else { player.pause(); } } }, { key: "exitFullscreen", value: function exitFullscreen(event) { var player = this.player; var fullscreen = player.fullscreen, cssfullscreen = player.cssfullscreen; if (fullscreen) { this.emitUserAction("keyup", "switch_fullscreen", { prop: "fullscreen", from: fullscreen, to: !fullscreen }); player.exitFullscreen(); } if (cssfullscreen) { this.emitUserAction("keyup", "switch_css_fullscreen", { prop: "cssfullscreen", from: cssfullscreen, to: !cssfullscreen }); player.exitCssFullscreen(); } } }, { key: "handleKeyDown", value: function handleKeyDown(e) { var _keyState = this._keyState; if (e.repeat) { _keyState.isPress = true; var _t = Date.now(); if (_t - _keyState.tt < 200) { return; } _keyState.tt = _t; } this.handleKeyCode(e.keyCode, e, _keyState.isPress); } }, { key: "handleKeyUp", value: function handleKeyUp(e) { var _keyState = this._keyState; if (_keyState.playbackRate > 0) { this.player.playbackRate = _keyState.playbackRate; _keyState.playbackRate = 0; } _keyState.isKeyDown = false; _keyState.isPress = false; _keyState.tt = 0; } }, { key: "handleKeyCode", value: function handleKeyCode(curKeyCode, event, isPress) { var arr = Object.keys(this.keyCodeMap); for (var i = 0; i < arr.length; i++) { var _this$keyCodeMap$arr$ = this.keyCodeMap[arr[i]], action = _this$keyCodeMap$arr$.action, keyCode = _this$keyCodeMap$arr$.keyCode, disable = _this$keyCodeMap$arr$.disable, pressAction = _this$keyCodeMap$arr$.pressAction, disablePress = _this$keyCodeMap$arr$.disablePress; if (keyCode === curKeyCode) { if (!disable && !(isPress && disablePress)) { var _action = !isPress ? action : pressAction || action; if (typeof _action === "function") { action(event, this.player, isPress); } else if (typeof _action === "string") { if (typeof this[_action] === "function") { this[_action](event, this.player, isPress); } } this.emit(SHORTCUT, _objectSpread2({ key: arr[i], target: event.target, isPress }, this.keyCodeMap[arr[i]])); } preventDefault(event); event.stopPropagation(); break; } } } }, { key: "destroy", value: function destroy() { this.player.root.removeEventListener("keydown", this.onKeydown); document.removeEventListener("keydown", this.onBodyKeyDown); this.player.root.removeEventListener("keyup", this.onKeyup); document.removeEventListener("keyup", this.onBodyKeyUp); } }, { key: "disable", value: function disable() { this.config.disable = true; } }, { key: "enable", value: function enable() { this.config.disable = false; } }], [{ key: "pluginName", get: function get() { return "keyboard"; } }, { key: "defaultConfig", get: function get() { return { seekStep: 10, checkVisible: false, disableBodyTrigger: false, disableRootTrigger: false, isGlobalTrigger: true, keyCodeMap: {}, disable: false, playbackRate: 2, isIgnoreUserActive: true }; } }]); return Keyboard2; }(BasePlugin); export { Keyboard as default };