/** * 公用JS库 * @time 20190731 * @name test */ if (typeof debug_mode === 'undefined') window.debug_mode = false; // 默认关闭调试模式 if (typeof enable_animate === 'undefined') window.enable_animate = false; // 默认关闭动画 if (typeof is_ott === 'undefined') window.is_ott = true; // 默认apk项目 /** * 一些常用键值 */ var KEY_BACK = 0x0008; // 返回/删除 var KEY_EXIT = 27; // 退出 var KEY_ENTER = 0x000D; // 确定 var KEY_PAGE_UP = 0x0021; // 上页 var KEY_PAGE_DOWN = 0x0022; // 下页 var KEY_LEFT = 0x0025; // 左 var KEY_UP = 0x0026; // 上 var KEY_RIGHT = 0x0027; // 右 var KEY_DOWN = 0x0028; // 下 var KEY_0 = 0x0030; // 0 var KEY_1 = 0x0031; // 1 var KEY_2 = 0x0032; // 2 var KEY_3 = 0x0033; // 3 var KEY_4 = 0x0034; // 4 var KEY_5 = 0x0035; // 5 var KEY_6 = 0x0036; // 6 var KEY_7 = 0x0037; // 7 var KEY_8 = 0x0038; // 8 var KEY_9 = 0x0039; // 9 var KEY_VOL_UP = 0x0103; // 音量加 var KEY_VOL_DOWN = 0x0104; // 音量减 var KEY_MUTE = 0x0105; // 静音 var KEY_TRACK = 0x0106; // 切换音轨 var KEY_PLAY_PAUSE = 0x0107; // 播放/暂停 var KEY_FAST_FORWARD = 0x0108; // 快进 var KEY_FAST_REWIND = 0x0109; // 快退 var KEY_IPTV_EVENT = 0x0300; // 虚拟事件按键 var KEY_RED = 0x0113; // 红色键 var KEY_GREEN = 0x0114; // 绿色键 var KEY_YELLOW = 0x0115; // 黄色键 var KEY_BLUE = 0x0116; // 蓝色键 var KEY_DELETE = 0x0118; // 删除键 var EVENT_MEDIA_END = 'EVENT_MEDIA_END'; //视频播放结束 var EVENT_MEDIA_ERROR = 'EVENT_MEDIA_ERROR'; //视频播放错误 /*湖南特殊键值*/ var KEY_HN_BACK = 'BACK'; var KEY_HN_LEFT = 'LEFT'; var KEY_HN_UP = 'UP'; var KEY_HN_RIGHT = 'RIGHT'; var KEY_HN_DOWN = 'DOWN'; var KEY_HN_ENTER = 'ENTER'; var KEY_HN_0 = 0; // 0 var KEY_HN_1 = 1; // 1 var KEY_HN_2 = 2; // 2 var KEY_HN_3 = 3; // 3 var KEY_HN_4 = 4; // 4 var KEY_HN_5 = 5; // 5 var KEY_HN_6 = 6; // 6 var KEY_HN_7 = 7; // 7 var KEY_HN_8 = 8; // 8 var KEY_HN_9 = 9; // 9 function Animator(duration, progress) { this.duration = duration; this.progress = progress; this.next = true; } Animator.prototype = { constructor: Animator, start: function(finished) { var startTime = new Date().getTime(); var duration = this.duration, self = this, timeOut = 0; var vendors = ["webkit", "moz"]; for(var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i){ window.requestAnimationFrame = window[vendors[i] + "RequestAnimationFrame"]; } if (!window.requestAnimationFrame) { window.requestAnimationFrame = function (callback, element) { var start = 0, finish = 0; window.setTimeout(function () { start = +new Date(); callback(start); finish = +new Date(); timeOut = 1000 / 300 - (finish - start); }, timeOut); }; } window.requestAnimationFrame(function step(){ var p = (new Date().getTime() - startTime) / duration; self.progress(p, p); if(p >= 1.0){ self.progress(1.0, 1.0); self.next = false; finished(); } if(self.next) window.requestAnimationFrame(step); }); }, stop: function() { this.next = false; } } /** * 公司自己的返回监听,一定要 */ window.onBackEvent=function(){ back(); } /** * 根据ID获取某个元素 */ function G(id) { return document.getElementById(id); } /** * 显示一个元素 */ function S(id) { var temp = G(id); if (temp) temp.style.visibility = 'visible'; } /** * 隐藏一个元素 */ function H(id) { var temp = G(id); if (temp) temp.style.visibility = 'hidden'; } /** * 返回IPTV门户或者apk来源地址 */ function goIptvPortal() { window.location.href = Authentication.CTCGetConfig('EPGDomain'); } /** * 定义一个命名空间 */ var PageH5 = { /** 回调函数 */ call: function(fn, args) { if (typeof fn === 'string' && fn) return eval('(' + fn + ')'); else if (typeof fn === 'function') { if (! (args instanceof Array)) { var temp = []; for (var i = 1; i < arguments.length; i++) temp.push(arguments[i]); args = temp; } return fn.apply(window, args); } }, /** 得到上下文路径 */ getContextPath: function() { return '/' + location.href.split('/')[3] + '/'; }, /** 得到当前窗口的父窗口 */ getParent: function() { return window == window.parent ? window.top: window.parent; }, /** 异步调用方法 */ myAjax: function(config) { var url = config.url; var data = config.data; var type = (config.type || 'GET').toUpperCase(); var contentType = config.contentType || 'application/x-www-form-urlencoded'; var dataType = config.dataType; var headers = config.headers || []; var fnSuccess = config.success; var fnError = config.error; var xmlhttp; if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest(); else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4) { var rsp = xmlhttp.responseText || xmlhttp.responseXML; if (dataType == 'json') rsp = eval("(" + rsp + ")"); if ((xmlhttp.status >= 200 && xmlhttp.status < 300) || xmlhttp.status == 304) PageH5.call(fnSuccess, [xmlhttp, rsp]); else PageH5.call(fnError, [xmlhttp, rsp]); } }; xmlhttp.open(type, url, true); for (var i = 0; i < headers.length; ++i) { xmlhttp.setRequestHeader(headers[i].name, headers[i].value); } xmlhttp.setRequestHeader('Content-Type', contentType); if (typeof data == 'object' && contentType == 'application/x-www-form-urlencoded') { var s = ''; for (attr in data) { s += attr + '=' + data[attr] + '&'; } if (s) { s = s.substring(0, s.length - 1); } xmlhttp.send(s); } else xmlhttp.send(data); } }; /** 按钮对象 */ PageH5.Button = PageH5.btn = { _buttonStore: {}, config: { defaultButtonId: '', buttons: [], imagePath: '', initKeys: true, eager: false }, /** 初始化 */ init: function(defaultButtonId, buttons, imagePath, initKeys, eager) { var config = defaultButtonId; if (arguments.length >= 2) { config = { defaultButtonId: defaultButtonId, buttons: buttons, imagePath: imagePath, initKeys: initKeys, eager: eager }; } for (var i in config) this.config[i] = config[i]; config = this.config; if (config.initKeys) { PageH5.key.init(); PageH5.key.set({ KEY_ENTER: 'PageH5.Button.click()', KEY_LEFT: 'PageH5.Button.move("left")', KEY_RIGHT: 'PageH5.Button.move("right")', KEY_UP: 'PageH5.Button.move("up")', KEY_DOWN: 'PageH5.Button.move("down")', KEY_BACK: 'back()', KEY_EXIT: 'back()' }); } this.previous = null, this._buttonStore = {}; for (var i = 0; i < config.buttons.length; i++) { var button = config.buttons[i]; var _button = G(button.id); if (!button) continue; button.focusClass = (button.focusClass && !/^btn_focus_.*$/g.test(button.focusClass) ? 'btn_focus_': '') + button.focusClass; if (!button.linkImage && _button) button.linkImage = _button.src; if (config.imagePath && button.focusImage && button.autoPrefix !== false && button.focusImage.indexOf('http') < 0) button.focusImage = config.imagePath + button.focusImage; if (config.imagePath && button.linkImage && button.autoPrefix !== false && button.linkImage.indexOf('http') < 0) button.linkImage = config.imagePath + button.linkImage; if (config.animate === false) button.animate = false; this._buttonStore[button.id] = button; if ((button.eager || config.eager) && button.focusImage) new Image().src = button.focusImage; } if (typeof config.defaultButtonId === 'string') this.current = this.get(config.defaultButtonId); else if (config.defaultButtonId instanceof Array) { for (var i = 0, max = config.defaultButtonId.length; i < max; i++) { var button = this.get(config.defaultButtonId[i]); if (button) { this.current = button; break; } } } this.update(); }, get: function(id) { if (id === undefined) id = this.current.id; if (G(id)) { var btn = this._buttonStore[id]; if (btn && btn.disable !== true) return this._buttonStore[id]; } }, move: function(dir) { this._dir = dir; if (this.current.beforeMove && PageH5.call(this.current.beforeMove, [dir, this.current]) === false) return; var button; var nextButtonId = this.current[dir]; if (typeof nextButtonId == "string") nextButtonId = [nextButtonId]; if (nextButtonId instanceof Array) { for (var i = 0; i < nextButtonId.length; i++) { button = this.get(nextButtonId[i]); if (button) break; } this.previous = this.current; if (button) { this.current = button; if (button.scrollDir === "x") { PageH5.scroll.repair(); this.update(); PageH5.scroll.check(button, dir); } else { PageH5.scrollScreen.repair(); this.update(); PageH5.scrollScreen.check(button, dir); } } } PageH5.call(this.current.moveHandler, [this.previous, this.current, dir]); }, set: function(buttonId) { var btn = this.get(buttonId); if (!btn) return; this.previous = this.current; this.current = btn; this.update(); }, click: function(interceptor, btnId) { if (btnId && btnId !== this.current.id) this.set(btnId); PageH5.call(interceptor, [this.current]); PageH5.call(this.current.action, [this.current]); }, update: function() { var prev = this.previous; var current = this.current; if (prev && G(prev.id)) { var _prev = G(prev.id); if (prev.focusClass) PageH5.removeClass(_prev, prev.focusClass); if (prev.linkImage) _prev.src = prev.linkImage; if (prev.twinkle) PageH5.twinkle.stop(); if (enable_animate && prev.zoom) { var parent = _prev.parentNode; var defaultScale = prev.defaultScale || 1; parent.style.webkitTransition = ''; parent.style.transition = ''; parent.style.webkitTransform = 'scale(' + defaultScale + ')'; parent.style.transform = 'scale(' + defaultScale + ')'; parent.style.zIndex = ''; } PageH5.call(prev.blurHandler, [prev]); } if (current) { var _current = G(current.id); if (current.focusClass) PageH5.addClass(_current, current.focusClass); if (current.focusImage) _current.src = current.focusImage; if (prev && enable_animate !== false && prev.animate && current.animate && prev.animateGroup === current.animateGroup) { var pImg = G(prev.id); var cImg = G(current.id); var p = pImg.parentNode; var c = cImg.parentNode; PageH5.Button._zIndex = c.style.zIndex; c.style.zIndex = 200; if (this.config.animateType === 'js') { PageH5.animate(c, { left: [PageH5.css(p, 'left'), PageH5.css(c, 'left')], top: [PageH5.css(p, 'top'), PageH5.css(c, 'top')] }, 'fast', function() { c.style.zIndex = PageH5.Button._zIndex; PageH5.Button._zIndex = undefined; if (PageH5.btn.current.twinkle) PageH5.twinkle.start(PageH5.btn.current.id, PageH5.btn.current.twinkle); }); PageH5.animate(cImg, { width: [PageH5.css(pImg, 'width'), PageH5.css(cImg, 'width')], height: [PageH5.css(pImg, 'height'), PageH5.css(cImg, 'height')] }, 'fast', function() {}, 'default2'); } else if (this.config.animateType === 'css3') { var _left = PageH5.css(c, 'left'), _top = PageH5.css(c, 'top'), _width = PageH5.css(cImg, 'width'), _height = PageH5.css(cImg, 'height'); PageH5.css(c, 'webkitTransition', ''); PageH5.css(c, 'transition', ''); PageH5.css(c, 'left', PageH5.css(p, 'left')); PageH5.css(c, 'top', PageH5.css(p, 'top')); PageH5.css(cImg, 'width', PageH5.css(pImg, 'width')); PageH5.css(cImg, 'height', PageH5.css(pImg, 'height')); setTimeout(function() { PageH5.css(c, 'webkitTransition', 'all 0.2s'); PageH5.css(c, 'transition', 'all 0.2s'); PageH5.css(c, 'left', _left); PageH5.css(c, 'top', _top); PageH5.css(c, 'width', _width); PageH5.css(c, 'height', _height); }, 20); PageH5.one(c, 'webkitTransitionEnd mozTransitionEnd MSTransitionEnd otransitionend transitionend', function() { c.style.zIndex = PageH5.Button._zIndex; PageH5.Button._zIndex = undefined; if (PageH5.btn.current.twinkle) PageH5.twinkle.start(PageH5.btn.current.id, PageH5.btn.current.twinkle); }); } } else { if (current.twinkle) PageH5.twinkle.start(current.id, current.twinkle); if (enable_animate && current.zoom) { var parent = G(current.id).parentNode; var zoomScale = current.zoomScale || 1.2; parent.style.zIndex = '200'; parent.style.webkitTransition = 'all 0.5s'; parent.style.transition = 'all 0.5s'; parent.style.webkitTransform = 'scale(' + zoomScale + ')'; parent.style.transform = 'scale(' + zoomScale + ')'; } } PageH5.call(current.focusHandler, [current]); } } }; /** apk 可 注入一个叫mp的对象 */ var mp; /** 播放器 */ PageH5.Mp = PageH5.mp = { speed: 1, state: 'play', muteFlag: 0, defaultTip: false, init: function(defaultTip) { try { this.defaultTip = defaultTip; if (!is_ott) { mp = new MediaPlayer(); var instanceId = mp.getNativePlayerInstanceID(); var playListFlag = 0; var videoDisplayMode = 1; var height = 100; var width = 100; var left = 50; var top = 50; var muteFlag = 0; var useNativeUIFlag = 1; var subtitleFlag = 0; var videoAlpha = 0; var cycleFlag = 1; var randomFlag = 0; var autoDelFlag = 0; mp.initMediaPlayer(instanceId, playListFlag, videoDisplayMode, height, width, left, top, muteFlag, useNativeUIFlag, subtitleFlag, videoAlpha, cycleFlag, randomFlag, autoDelFlag); mp.setAllowTrickmodeFlag(0); } mp.setProgressBarUIFlag(0); mp.setAudioVolumeUIFlag(1); } catch(e) {} }, pause: function(callback) { this.speed = 1; this.state = 'pause'; try { mp.pause(); } catch(e) {} PageH5.call(callback, [this]); }, resume: function(callback) { this.speed = 1; this.state = 'play'; try { mp.resume(); } catch(e) {} PageH5.call(callback, [this]); }, playOrPause: function(callback) { if (this.state == 'play') this.pause(); else this.resume(); PageH5.call(callback, [this.state, this]); }, fastForward: function(callback) { if (this.speed >= 32 || this.state == 'fastRewind') this.resume(); else { this.speed = this.speed * 2; this.state = 'fastForward'; mp.fastForward(this.speed); } PageH5.call(callback, [this.state, this.speed, this]); }, fastRewind: function(callback) { if (this.speed >= 32 || this.state == 'fastForward') { this.resume(); } else { this.speed = this.speed * 2; this.state = 'fastRewind'; mp.fastRewind( - this.speed); } PageH5.call(callback, [this.state, this.speed, this]); }, volUp: function(callback) { var volume = ( + mp.getVolume()); if (is_ott) { var temp = 5 - (volume % 5); volume = volume + temp; } else { volume += 5; volume = volume > 100 ? 100 : volume; } mp.setVolume(volume); PageH5.call(callback, [volume, this]); }, volDown: function(callback) { var volume = ( + mp.getVolume()); if (is_ott) { var temp = volume % 5; temp = temp === 0 ? 5 : temp; volume = volume - temp; } else { volume -= 5; volume = volume < 5 ? 0 : volume; } mp.setVolume(volume); PageH5.call(callback, [volume, this]); }, switchAudioChannel: function(callback) { mp.switchAudioChannel(); PageH5.call(callback, [this.getCurrentAudioChannel(), this]); }, getCurrentAudioChannel: function() { if (!mp) return 'Stereo'; return mp.getCurrentAudioChannel() || 'Stereo'; }, toggleMuteFlag: function(callback) {++this.muteFlag; mp.setMuteFlag(this.muteFlag % 2); PageH5.call(callback, [this.muteFlag % 2, this]); }, getMediaStr: function(url) { var json = ''; json += '[{mediaUrl:"' + url + '",'; json += 'mediaCode: "jsoncode1",'; json += 'mediaType:2,'; json += 'audioType:1,'; json += 'videoType:1,'; json += 'streamType:1,'; json += 'drmType:1,'; json += 'fingerPrint:0,'; json += 'copyProtection:1,'; json += 'allowTrickmode:1,'; json += 'startTime:0,'; json += 'endTime:20000.3,'; json += 'entryID:"jsonentry1"}]'; return json; }, fullscreenPlay: function(url) { try { if (is_ott) { var type = (url && /\.mp3$/g.test(url)) ? 0 : 1; mp.initMediaPlayer(url, type); } else { mp.setSingleMedia(this.getMediaStr(url)); mp.setVideoDisplayMode(1); mp.refreshVideoDisplay(); } mp.playFromStart(); } catch(e) {} }, smallvodPlay: function(url, left, top, width, height) { try { if (is_ott) { if (url && /\.mp3$/g.test(url)) mp.initMediaPlayer(url, 0); else mp.initMediaPlayer(url, left, top, width, height); } else { mp.setSingleMedia(this.getMediaStr(url)); mp.setVideoDisplayMode(0); mp.setVideoDisplayArea(left, top, width, height); mp.refreshVideoDisplay(); } mp.playFromStart(); } catch(e) {} }, playByTime: function(second) { mp.playByTime(1, second); }, getCurrentPlayTime: function() { if (mp) return (mp.getCurrentPlayTime() || 0); else return 0; }, getMediaDuration: function() { if (mp) return (mp.getMediaDuration() || 0); else return 0; }, parseTimeInfo: function(second) { var m = Math.floor(second / 60); m = m < 10 ? ('0' + m) : m; var s = second % 60; s = s < 10 ? ('0' + s) : s; return m + ':' + s; }, getPlayTimeInfo: function() { return this.parseTimeInfo(this.getCurrentPlayTime()) + '/' + this.parseTimeInfo(this.getMediaDuration()); }, getRate: function() { var duration = this.getMediaDuration(); if (duration === 0) return 0; return this.getCurrentPlayTime() / duration; }, destroy: function() { if (mp) mp.stop(); }, isEndOrError: function(keyCode) { return keyCode === 'EVENT_MEDIA_END' || keyCode === 'EVENT_MEDIA_ERROR'; } }; (function(document) { var event_handler = function(e) { e = e || window.event; var keyCode = e.which || e.keyCode; if (keyCode === KEY_IPTV_EVENT) { eval('oEvent = ' + Utility.getEvent()); PageH5.eventHandler(oEvent.type, true); } else { if (keyCode === KEY_BACK) e.preventDefault(); PageH5.eventHandler(keyCode); } }; /*if (is_ott || (debug_mode && /webkit/g.test(navigator.userAgent.toLowerCase()))) document.onkeydown = event_handler; else document.onkeypress = event_handler;*/ try{ Webview.requestFocus(); Webview.setKeyEventHandler(function (action, keyCode, keyName, metaState){ KEY_BACK = KEY_HN_BACK; KEY_ENTER = KEY_HN_ENTER; KEY_LEFT = KEY_HN_LEFT; KEY_UP = KEY_HN_UP; KEY_RIGHT = KEY_HN_RIGHT; KEY_DOWN = KEY_HN_DOWN; KEY_0 = KEY_HN_0; KEY_1 = KEY_HN_1; KEY_2 = KEY_HN_2; KEY_3 = KEY_HN_3; KEY_4 = KEY_HN_4; KEY_5 = KEY_HN_5; KEY_6 = KEY_HN_6; KEY_7 = KEY_HN_7; KEY_8 = KEY_HN_8; KEY_9 = KEY_HN_9; PageH5.eventHandler(keyName); }); }catch(e){ document.onkeydown = event_handler; } })(document);