123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469 |
- (function (arr) {
- //remove();//兼容
- arr.forEach(function (item) {
- if (item.hasOwnProperty('remove')) {
- return;
- }
- Object.defineProperty(item, 'remove', {
- configurable: true,
- enumerable: true,
- writable: true,
- value: function remove() {
- this.parentNode.removeChild(this);
- }
- });
- });
- })([Element.prototype, CharacterData.prototype, DocumentType.prototype]);
- if (!("classList" in document.documentElement)) {
- Object.defineProperty(HTMLElement.prototype, 'classList', {
- get: function () {
- var self = this;
- function update(fn) {
- return function (value) {
- var classes = self.className.split(/\s+/g),
- index = classes.indexOf(value);
- fn(classes, index, value);
- self.className = classes.join(" ");
- }
- }
- return {
- add: update(function (classes, index, value) {
- if (!~index) classes.push(value);
- }),
- remove: update(function (classes, index) {
- if (~index) classes.splice(index, 1);
- }),
- toggle: update(function (classes, index, value) {
- if (~index)
- classes.splice(index, 1);
- else
- classes.push(value);
- }),
- contains: function (value) {
- return !!~self.className.split(/\s+/g).indexOf(value);
- },
- item: function (i) {
- return self.className.split(/\s+/g)[i] || null;
- }
- };
- }
- });
- }
- function fireKeyEvent(el, evtType, keyCode) {
- var doc = el.ownerDocument,
- win = doc.defaultView || doc.parentWindow,
- evtObj;
- if (doc.createEvent) {
- if (win.KeyEvent) {
- evtObj = doc.createEvent('KeyEvents');
- evtObj.initKeyEvent(evtType, true, true, win, false, false, false, false, keyCode, 0);
- } else {
- evtObj = doc.createEvent('UIEvents');
- Object.defineProperty(evtObj, 'keyCode', {
- get: function () {
- return this.keyCodeVal;
- }
- });
- Object.defineProperty(evtObj, 'which', {
- get: function () {
- return this.keyCodeVal;
- }
- });
- evtObj.initUIEvent(evtType, true, true, win, 1);
- evtObj.keyCodeVal = keyCode;
- if (evtObj.keyCode !== keyCode) {
- console.log("keyCode " + evtObj.keyCode + " 和 (" + evtObj.which + ") 不匹配");
- }
- }
- el.dispatchEvent(evtObj);
- } else if (doc.createEventObject) {
- evtObj = doc.createEventObject();
- evtObj.keyCode = keyCode;
- el.fireEvent('on' + evtType, evtObj);
- }
- }
- //classList兼容
- (function (window) {
- var tvSysBtnBind = function (init) {
- var _this = this,
- _self = self;
- var id = init.id ? init.id : null,
- keyRemoveDefault = init.keyRemoveDefault ? true : false,
- currentIndex = init.currentIndex ? parseInt(init.currentIndex): 0,
- btnLeft = init.btnLeft ? init.btnLeft : 37,
- btnUp = init.btnUp ? init.btnUp : 38,
- btnRight = init.btnRight ? init.btnRight : 39,
- btnDown = init.btnDown ? init.btnDown : 40,
- btnEnter = init.btnEnter ? init.btnEnter : 13,
- history = init.history ? init.history : true,
- currentClass = init.currentClass ? init.currentClass : "current",
- doc = id?document.getElementById(id):document.body,
- effect = init.effect ? init.effect : "slide1",
- element = new Array(),
- rules = Object.prototype.toString.call(init.rules) == '[object Object]' ? init.rules : null,
- direction = "y";
- _this.className = init.className ? init.className : "hotbutton";
- this.event = {};
-
- var _tempElem;
- this.currentIndex = parseInt(currentIndex);
- this.defaultIndex = parseInt(currentIndex);
- this.historyFocus={};
- if(!window.focusobj)window.focusobj=document.createElement("span");
- (typeof init.onLoad) == "function" ? init.onLoad: init.onLoad = function () {};
- this.onLoad = function () {
- _this.reLoad();
- this.sourceClassName = _this.className;
- this.sourceLength = element.length;
- //element[currentIndex].classList.add(currentClass);
- _this.prev = element[currentIndex];
- _this.prevIndex = currentIndex;
- _this.current = element[currentIndex];
- _this.currentIndex = currentIndex;
- _this.target = doc;
- init.onLoad.call(_this);
- focusobj.innerHTML='<div class="cssbk"><b class="lt"></b><b class="t"></b><b class="rt"></b><b class="r"></b><b class="rb"></b><b class="b"></b><b class="lb"></b> <b class="l"></b></div>';
- focusobj.classList.add("focusobj");
- focusobj.classList.add("current");
- this.target.appendChild(focusobj);
- }
- this.reSetClass = function (item, index) {
- //新组别 用于弹窗 不同组热键 API
- if(history) //记录开关
- _this.historyFocus[_this.className]=_this.currentIndex;//记录上一组焦点
- index = index ? index : 0;
- _this.prev.classList.remove(currentClass);
- _this.className = item;
- _this.prevIndex= _this.currentIndex=_this.historyFocus[item]?_this.historyFocus[item]:index;
- _this.reLoad();
- }
- self.readFn=function(){
- if((typeof init.onEnterPress) == "function"){
- init.onEnterPress
- }else{
- init.onEnterPress = function () {}
-
- }
-
-
-
- if((typeof init.onPress) == "function"){
- init.onPress
- }else{
- init.onPress = function () {}
-
- }
-
-
- }
- this.reLoad = function () {
-
-
- self.readFn();
- if (doc != null) {
- element = doc.getElementsByClassName(_this.className);
- this.hotbtn = element;
- }
- if (element.length <= 0) return false;
- if (_this.currentIndex || _this.currentIndex == 0) {
- _this.currentIndex = parseInt(_this.currentIndex);
- } else {
- _this.currentIndex = parseInt(init.currentIndex);
- }
- if (isload >= 2 && _this.sourceClass == _this.className && _this.sourceLength != element.length && !isSet) {
- //页面加载到接口加载不进行计算 重置class也不计算 手动设置焦点不算
- // 如果元素数量发生过变化 将进行换算当前元素 重新算元素索引
- //修复同组的元素变化的问题
- if (_this.prev.classList.contains(_this.className)&&_this.sourceLength > element.length) {
- //当元素减少
- _this.currentIndex = _this.currentIndex - (_this.sourceLength - element.length);
- _this.prevIndex = _this.prevIndex - (_this.sourceLength - element.length);
- _this.sourceLength = element.length;
- } else if (_this.prev.classList.contains(_this.className)&&_this.sourceLength < element.length) {
- //当元素增加
- _this.currentIndex = _this.currentIndex + (element.length - _this.sourceLength);
- _this.prevIndex = _this.prevIndex + (element.length - _this.sourceLength);
- _this.sourceLength = element.length;
- }
- }
- isSet = false;
- _this.prev = element[_this.currentIndex];
- _this.prevIndex = _this.currentIndex;
- _this.current = element[_this.currentIndex];
- _this.currentIndex = _this.currentIndex;
-
- _self.classDo(_this.currentIndex);
-
- for (var i = 0; i < this.hotbtn.length; i++) {
- this.hotbtn[i].setAttribute("data-id", i);
- }
- }
- function keydefault(e) {
- try{
- if (keyRemoveDefault) window.event ? window.event.returnValue = false : e.preventDefault();
- }catch(e){
- //不支持浏览器按键的时候会报错
- }
-
- }
-
- var isSet = false;
- this.setCurrentIndex = function (index) {
- isSet = true;
- index = parseInt(index);
- _this.currentIndex = index;
- _this.current = element[index];
-
- }
- this.viewScrollY = function (y) {
- if(y<0)y=0;
- _this.current.parentNode.style.top=-y+"px";
- _this.current.parentNode.style.left=0+"px";
- //view.scrollTop = view.scrollTop + y+(y*0.1);
- }
- this.viewScrollX = function (x) {
- if(x<0)x=0;
- _this.current.parentNode.style.left=-x+"px";
- _this.current.parentNode.style.top=0+"px";
- //view.scrollLeft = view.scrollLeft + x+(x*0.1);
- }
-
- this.onPress = function (e) {
- init.onPress.call(_this);
-
- }
-
- this.onEnterPress = function () {
- init.onEnterPress.call(_this);
-
- }
- self.getScrollTop = function () {
- var scrollTop = 0;
- if (document.documentElement && document.documentElement.scrollTop) {
- scrollTop = document.documentElement.scrollTop;
- } else if (document.body) {
- scrollTop = document.body.scrollTop;
- }
- return scrollTop;
- }
- this.scroll = function () {
- var view=_this.current.parentNode.parentNode;
- var direction = view.getAttribute("data-scroll-direction");
- if(!direction) return;
- view.style.position="relative";
- _this.current.parentNode.style.position="absolute";
- if(direction=="x"){
- _this.current.parentNode.style.width= (_this.hotbtn.length*_this.current.clientWidth*2)+"px";
- if ( _this.current.getBoundingClientRect().left-view.getBoundingClientRect().left-_this.current.getBoundingClientRect().width<0) {
- _this.viewScrollX(_this.current.getBoundingClientRect().left-view.getBoundingClientRect().left );
- }
- if(_this.current.getBoundingClientRect().left-view.getBoundingClientRect().left+_this.current.getBoundingClientRect().width>view.getBoundingClientRect().width){
- _this.viewScrollX(_this.current.getBoundingClientRect().left-(view.getBoundingClientRect().left)-_this.current.getBoundingClientRect().width);
- }
- }
-
- if(direction=="y"){
- if ( _this.current.getBoundingClientRect().top-view.getBoundingClientRect().top-_this.current.getBoundingClientRect().height<0) {
- _this.viewScrollY(_this.current.getBoundingClientRect().top-view.getBoundingClientRect().top );
- }
- if(_this.current.getBoundingClientRect().top-view.getBoundingClientRect().top+_this.current.getBoundingClientRect().height>view.getBoundingClientRect().height){
- _this.viewScrollY(_this.current.getBoundingClientRect().top-view.getBoundingClientRect().top-_this.current.getBoundingClientRect().height);
- }
- }
-
- }
-
-
- var isload = 0;
- self.classDo = function (index) {
- isload = isload + 1;
- if (isload == 2) {
- _this.sourceLength = element.length;
- }
- if(element[index])
- element[index].classList.add(currentClass);
- else return;
- //如果元素不存在 不进行渲染 待重载
- for (var i = 0; i < element.length; i++) {
- if (i!=index&&element[i].classList.contains(currentClass)) {
- element[i].classList.remove(currentClass);
- }
- }
- _this.scroll();//渲染的之前先复位
- var effect= element[index].getAttribute("data-effect");
- if(effect){
- focusobj.setAttribute("style"," position: fixed; z-index: 19;width:"+(element[index].getBoundingClientRect().width)+"px ;height:"+(element[index].getBoundingClientRect().height)+"px; left:"+element[index].getBoundingClientRect().left+"px;top:"+element[index].getBoundingClientRect().top+"px;");
- focusobj.setAttribute("class","focusobj current "+effect);
- } else {
- focusobj.setAttribute("class","hide ");
- focusobj.setAttribute("style","");
- }
-
- }
- self.EventUtil = {
- add: function (obj, callback) {
- if (typeof (obj.onkeypress) == "null") {
- obj.onkeypress = function (e) {
- callback && callback(e)
- }
- } else {
- obj.onkeydown = function (e) {
- callback && callback(e)
- }
- }
- }
- }
- EventUtil.add(document, function (e) {
- _self.onPressdo(e);
- });
- self.overIndex=function(){
- //防止超出
- if (_this.currentIndex >= element.length - 1) {
- _this.currentIndex = element.length - 1;
- }
- if (_this.currentIndex < 0) {
- _this.currentIndex = 0;
- }
- }
- self.isNumber = function(val){
- var regPos = /^\d+(\.\d+)?$/; //非负浮点数
- var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数
- if(regPos.test(val) || regNeg.test(val)){
- return true;
- }else{
- return false;
- }
- }
-
- self.ruleFn=function(index,direction){
- if(rules && typeof rules[_this.className] == "object" &&typeof rules[_this.className]["line"] !="undefined" )
- {
- var line = rules[_this.className]["line"];
- }else{
- var line=_this.hotbtn.length;
- }
- line=parseInt(line);
- if (rules && typeof rules[_this.className] == "object" && typeof rules[_this.className][_this.currentIndex]!="undefined"&& typeof rules[_this.className][_this.currentIndex][index]!="undefined") {
- var objRules = rules[_this.className][_this.currentIndex];
- if(self.isNumber(objRules[index])){
- _this.currentIndex = parseInt(_this.currentIndex) + parseInt(objRules[index]);
- }else if(Array.isArray(objRules[index])){
- //_this.currentIndex = _this.currentIndex + parseInt(objRules[index][1]);
- _this.reSetClass(objRules[index][0], objRules[index][1]);
- }else if(typeof rules[_this.className]["line"] !="undefined"){
- _this.currentIndex = _this.currentIndex + line;
- }
-
- } else {
- var jump = element[_this.currentIndex].getAttribute("data-"+direction);
- jump=parseInt(jump);
- var obj = rules[_this.className];
- if(direction=="up"){
- if(_this.currentIndex>line-1) //上边沿
- _this.currentIndex= jump?_this.currentIndex-jump:_this.currentIndex-line;
- else if(obj&&typeof obj["up"]!="undefined" ) _this.reSetClass(obj[direction][0], obj["up"][1]);
- }else if(direction=="left"){
- if((_this.currentIndex)%line!=0) //左边
- _this.currentIndex= jump?_this.currentIndex-jump:_this.currentIndex-1;
- else if(obj&&typeof obj["left"]!="undefined" ) _this.reSetClass(obj["left"][0], obj["left"][1]);
- }else if(direction=="right"){
- if((_this.currentIndex+1)%line!=0) //右边
- _this.currentIndex= jump?_this.currentIndex+jump:_this.currentIndex+1;
- else if(obj&&typeof obj["right"]!="undefined" ) _this.reSetClass(obj["right"][0], obj["right"][1]);
- }else if(direction=="down"){
- if(_this.hotbtn.length-line>_this.currentIndex) //下边沿
- _this.currentIndex= jump?_this.currentIndex+jump:_this.currentIndex+line;
- else if(obj&&typeof obj["down"]!="undefined" ) _this.reSetClass(obj["down"][0], obj["down"][1]);
- }
- }
- }
- self.rule = function () {
- self.overIndex();
- if (_this.event.keyCode == btnLeft) {
- self.ruleFn(0,"left");
- } else if (_this.event.keyCode == btnRight) {
- self.ruleFn(2,"right");
- } else if (_this.event.keyCode == btnUp) {
- self.ruleFn(1,"up");
- } else if (_this.event.keyCode == btnDown) {
- self.ruleFn(3,"down");
- }
- self.overIndex();
- }
- self.onPressdo = function (e) {
- _this.event = e;
- _this.currentIndex = _this.currentIndex >= element.length - 1 ? element.length - 1 : _this.currentIndex;
- _this.prev = element[_this.currentIndex];
- _this.prevIndex = _this.currentIndex;
- self.rule();
- _this.current = element[_this.currentIndex];
- _this.currentIndex = _this.currentIndex;
- _this.className = _this.className;
-
- if((typeof init.rules[_this.className]["onPress"]) == "function")
- init.rules[_this.className]["onPress"].call(_this);
- else _this.onPress.call(_this);
- if (e.keyCode == btnEnter){
-
- if((typeof init.rules[_this.className]["onEnterPress"]) == "function")
- init.rules[_this.className]["onEnterPress"].call(_this);
- else _this.onEnterPress.call(_this);
- }
-
- _self.classDo(_this.currentIndex);
- keydefault(e);
- }
-
-
- this.onLoad();//插件加载时
- }
-
- window.tvSysBtnBind = tvSysBtnBind;
- })(window)
|