123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674 |
- /**
- * 公用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);
|