function CoolInput(setting) { //setting.data; //setting.slt; var _this = this; _this.cursorPosition = -1; _this.cursorX = -1; _this.focused = false; _this.inputEl = $(setting.slt); _this.myScale = setting.myScale; var modelVar = _this.inputEl.attr('v-model'); _this.inputEl.attr('readonly', 'readonly'); if (_this.inputEl.length === 0) throw (slt + ' not exist'); var input = _this.inputEl[0]; if (!CoolInput.arrInputEl) CoolInput.arrInputEl = []; CoolInput.arrInputEl.push(input); function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", "iPhone", "Windows Phone", "iPad", "iPod"]; var flag = true; for (var v = 0; v < Agents.length; v++) { if (userAgentInfo.indexOf(Agents[v]) > 0) { flag = false; break; } } return flag; } var isOnPC = IsPC(); function val(newV) { if (newV != undefined) { if (input.tagName === 'DIV') { input.innerText = newV; } else if (input.value != undefined) { input.value = newV; } } else { if (input.tagName === 'DIV') { return input.innerText; } else if (input.value != undefined) { return input.value; } } } function getTextWidth(txt,size) { var tmpDiv = window.coolInputTmpDiv; if (!tmpDiv) { tmpDiv = window.coolInputTmpDiv = $('<div style="position:fixed;display:block;z-index:99999;top:300px;left:100px;visibility:hidden;"><div>'); $(document.body).append(tmpDiv); // tmpDiv.css('top', _this.inputEl.offset().top - 30 + 'px'); //tmpDiv.css('left', _this.inputEl.offset().left + 'px'); } var fontSize = _this.inputEl.css('font-size'); tmpDiv.css('font-size', fontSize); tmpDiv.css('font-weight', _this.inputEl.css('font-weight')); var sp = _this.inputEl.css('letter-spacing'); tmpDiv.css('letter-spacing', sp); var fnt = _this.inputEl.css('font-family'); tmpDiv.css('font-family', fnt); tmpDiv.html(txt); if (size) { size.height = tmpDiv[0].offsetHeight; size.width = tmpDiv[0].offsetWidth; } return tmpDiv[0].offsetWidth;// width(); } function showPanel (mouseDownEvent) { var Panel = _this.Panel = $('#coolInputPanel'); if (Panel.length === 0) { var style = `<style> #coolInputPanel>div{ width: 31%;height:40px;text-align:center;line-height:40px; border-width:1px;border-style:solid;border-color:#cacaca;border-top-style:none;border-left-style:none; } #coolInputPanel>div:nth-child(n+10){border-bottom-style:none;} #coolInputPanel>div:nth-child(3n){ border-right-style:none;} #coolInputPanel>div:active{background-color:#7af;} </style>`; $(document.body).append($(style)); var divHtml = ` <div id="coolInputPanel" style="background-color:#dedede;font-size:18px;font-weight:bold; position:fixed;left:0px;bottom:0px;width:100%;height:200px;display:flex;justify-content:center;align-content:center; flex-wrap:wrap;z-index:99999;"> <div>1</div><div>2</div><div>3</div> <div>4</div><div>5</div><div>6</div> <div>7</div><div>8</div><div>9</div> <div>.</div><div>0</div> <div id="del"> <svg style="display:inline;height:23px;width:23px;margin-top:9px;" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve"> <g><g transform="translate(0.000000,511.000000) scale(0.100000,-0.100000)"><path d="M3781.8,3617c-116.7-17.2-350.2-82.3-482.2-137.8c-344.4-141.6-317.6-118.6-1722.2-1519.4C186.2,572.5,191.9,578.2,126.9,329.5C73.3,119,100.1-104.9,205.3-317.3c40.2-78.5,311.9-363.6,1333.8-1387.4c1379.7-1381.6,1408.4-1408.4,1743.3-1548.1c82.3-34.4,216.2-82.3,296.6-107.1l145.4-42.1l2669.4-5.7c1883-3.8,2698.1,1.9,2769,15.3c334.9,70.8,616.2,342.5,704.2,683.2c44,164.6,44,5472.9,0,5637.4c-86.1,331.1-340.6,587.5-669.7,673.6c-99.5,24.9-436.3,28.7-2736.4,26.8C5019.9,3626.6,3814.3,3620.8,3781.8,3617z M9141.7,2968.3c28.7-21.1,70.8-63.1,91.9-91.9c40.2-51.7,40.2-55.5,40.2-2767c0-2711.6,0-2715.4-40.2-2767c-21.1-28.7-63.2-70.8-91.9-91.9c-51.7-40.2-61.2-40.2-2648.4-45.9c-2543.2-3.8-2598.7-3.8-2747.9,34.4c-84.2,21-225.8,72.7-315.7,116.7l-164.6,78.5L1998.3-1299C622.5,75,687.5,0.3,718.2,182.1c11.5,63.2,158.8,214.3,1280.2,1335.7c1264.9,1264.9,1266.8,1266.8,1429.4,1345.2c340.6,164.6,111,153.1,3056,149.3C9082.4,3008.5,9090.1,3008.5,9141.7,2968.3z"/><path d="M4566.4,1919.7c-78.5-34.4-158.8-132-174.1-212.4c-30.6-168.4-40.2-156.9,706.1-903.2l692.7-694.6l-692.7-692.7c-748.2-750.1-736.7-736.7-704.2-909c17.2-93.8,132-208.6,225.8-225.8c172.2-32.5,158.8-44,909,704.2l692.7,692.7l694.6-692.7c748.2-748.2,734.8-736.7,907-704.2c93.8,17.2,208.6,132,225.8,225.8c32.5,172.2,44,158.8-704.2,909l-692.7,692.7L7344.9,804c748.2,748.2,736.7,734.8,704.2,907.1c-17.2,93.8-132,208.6-225.8,225.8c-172.2,32.5-158.8,44-909-704.2L6221.6,540l-685.1,683.1c-375,375.1-708,692.7-736.7,704.2C4727.1,1954.1,4637.2,1950.3,4566.4,1919.7z"/></g></g> </svg> </div> </div>`; Panel = _this.Panel = $(divHtml); $(document.body).append(Panel); } if (isOnPC) { Panel[0].onmousedown = onTouchPanel; } else { Panel[0].ontouchstart = onTouchPanel; } if (mouseDownEvent) { // mouseDownEvent.preventDefault(); // mouseDownEvent.stopPropagation(); } function onTouchPanel (evt) { var digit = evt.target.innerText; var txt = val(); var targetDiv = evt.target; if (evt.target.tagName !== 'DIV') targetDiv = $(evt.target).parents('div')[0]; if (targetDiv.id === 'del' ) { if (_this.cursorPosition === val().length) { val(txt.substr(0, txt.length - 1)); _this.cursorX = getTextWidth(val()); _this.cursorPosition--; } else { val(txt.substring(0, _this.cursorPosition - 1) + txt.substring(_this.cursorPosition, txt.length)); _this.cursorPosition--; _this.cursorX = getTextWidth(val().substring(0, _this.cursorPosition)); } if (val().length === 0) { _this.cursorPosition = val().length; _this.cursorX = getTextWidth(val()); } } else if (digit && digit.length === 1 && '0,1,2,3,4,5,6,7,8,9,.'.indexOf(digit) >= 0) { if(val().length>5)return; if (_this.cursorPosition === val().length) { val(txt + digit); _this.cursorX = getTextWidth(val()); _this.cursorPosition++; } else { val(txt.substring(0, _this.cursorPosition) + digit + txt.substring(_this.cursorPosition, txt.length)); _this.cursorPosition++; _this.cursorX = getTextWidth(val().substring(0, _this.cursorPosition)); } } else { var ffff = 8; } showCursor(true); if (setting.data && modelVar) { setting.data[modelVar] = val(); } }; if (!_this.focused) { if (_this.Panel.css('display') === 'none') { _this.Panel.css('margin-bottom', - _this.Panel.height()); _this.Panel.show(); _this.Panel.animate({ 'margin-bottom': '0px' }, { duration: 400 }); } } var top = _this.inputEl.offset().top; var left = _this.inputEl.offset().left; if (!mouseDownEvent || val().length === 0) { _this.cursorPosition = val().length; _this.cursorX = getTextWidth(val()); } else { var insertIndex = -1; var preDigitX = -1; var curDigitX = -1; for (var i = 0; i < val().length; i++) { var bc = val().substring(0, i + 1); var wd = getTextWidth(bc); var curDigit = val().substr(i, 1); var digitWd = getTextWidth(curDigit); curDigitX = wd - digitWd / 2; if (mouseDownEvent.offsetX > preDigitX && mouseDownEvent.offsetX <= curDigitX) { _this.cursorPosition = i; _this.cursorX = wd - digitWd; break; } else if (i === val().length - 1) { _this.cursorPosition = val().length; _this.cursorX = wd; } preDigitX = curDigitX; } } if (!_this.tmCoolInput) { var bShow = true; _this.tmCoolInput = setInterval(function () { showCursor(bShow); bShow = !bShow; }, 600); } showCursor(true); _this.focused = true; }; function showCursor(bShow) { _this.divCursor = $('#coolInputCursor'); if (_this.divCursor.length === 0) { _this.divCursor = $('<div id="coolInputCursor" style="width:2px;z-index:99999;background-color:#000;position:fixed;display:none;"></div>'); $(document.body).append(_this.divCursor); // var sz = {}; //getTextWidth('3', sz); //var ht=sz.height+2; } var pad = 0; var pad2 = 0; var cx = _this.inputEl.offset().left + (_this.cursorX+10)*_this.myScale; var cy = _this.inputEl.offset().top; var ht = _this.inputEl.height(); if (_this.myScale==1) { pad = 8; pad2=ht-7*2; }else { pad2=(ht-6*2)*_this.myScale; pad = 20; } _this.divCursor.height(pad2); _this.divCursor.css('left', cx + 'px'); _this.divCursor.css('top', cy+pad + 'px'); if (bShow) { _this.divCursor.show(); } else { _this.divCursor.hide(); } } input.onclick = function () { showPanel(); }; document.addEventListener('touchend', function (evt) { if (!_this.focused) return; //ignore the click on the panel if (evt.target.id === "coolInputPanel") return; if (evt.target === input) return; var panelMum = $(evt.target).parents('#coolInputPanel'); if (panelMum.length > 0) { return; } if (_this.divCursor && _this.divCursor.length > 0 && evt.target === _this.divCursor[0]) return; var destIsInput = false; CoolInput.arrInputEl.every(function (el) { if (el === evt.target) { destIsInput = true; return false; } return true; }); if (!destIsInput) { if (_this.divCursor) { _this.divCursor.hide(); } if (_this.Panel) { _this.Panel.animate({ 'margin-bottom': '-200px' }, { duration: 400, complete: function () { _this.Panel.hide(); } }); } } if (_this.tmCoolInput) { clearInterval(_this.tmCoolInput); _this.tmCoolInput = 0; } _this.focused = false; }); }