-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathellipsis.min.js
1 lines (1 loc) · 5.56 KB
/
ellipsis.min.js
1
!function(){"use strict";function a(a){var c=l(b,a||{});this.create(c),this.add()}var b={ellipsis:"…",debounce:0,responsive:!0,className:".clamp",lines:2,portrait:null,break_word:!0},c=0,d=window.innerWidth,e=!!window.requestAnimationFrame,f=function(){return c+=1},g=function(a,b){a.setAttribute("data-ellipsis-id",b)},h=function(a){return a.getAttribute("data-ellipsis-id")},i=function(a,b){var c=f();g(b,c),a[c]=a[c]||{},a[c].element=b,a[c].innerHTML=b.innerHTML},j=function(a,b){return a?a[h(b)]:null},k=function(a){return Object.keys(a).map(function(b,c){return a[b].element})},l=function(a,b){var c={};for(var d in a)c[d]=a[d];for(var e in b)c[e]=b[e];return c};a.prototype={conf:{},prop:{},lines:{},temp:null,listener:null,create:function(a){if(this.conf=a,this.lines={get current(){return a.portrait&&window.innerHeight>window.innerWidth?a.portrait:a.lines}},this.conf.responsive){this.temp={};var b,c=this.conf.debounce;if(e&&!c){this._isScheduled=!1;var f=this;b=function(a){window.innerWidth!=d&&(d=window.innerWidth,f._isScheduled||(f._isScheduled=!0,window.requestAnimationFrame(function(){f._isScheduled=!1,f.add(k(f.temp))})))}}else{c=c||16;var g;b=function(a){window.innerWidth!=d&&(d=window.innerWidth,clearTimeout(g),g=setTimeout(function(){this.add(k(this.temp))}.bind(this),c))}}this.listener=b.bind(this),window.addEventListener("resize",this.listener,!1),window.removeEventListener("beforeunload",this.listener,!1)}},destroy:function(){this.listener&&window.removeEventListener("resize",this.listener,!1)},createProp:function(a){this.prop={get height(){var b=a.getBoundingClientRect();return parseInt(b.bottom-b.top,10)},get lineheight(){var b=getComputedStyle(a).getPropertyValue("line-height");return String("normal|initial|inherit").indexOf(b)>-1&&(b=parseInt(getComputedStyle(a).getPropertyValue("font-size"),10)+2),parseInt(b,10)}}},add:function(a){if(!a&&this.conf.className&&(a=document.querySelectorAll(this.conf.className)),a)if(a.length)for(var b=0;b<a.length;b++)this.addElement(a[b]);else void 0===a.length&&this.addElement(a)},addElement:function(a){if(this.conf.responsive){var b=j(this.temp,a);b?a.innerHTML!==b.innerHTML&&(a.innerHTML=b.innerHTML):i(this.temp,a)}this.createProp(a),this.isNotCorrect()&&(a.childNodes.length&&a.childNodes.length>1?this.handleChildren(a):a.childNodes.length&&1===a.childNodes.length&&3===a.childNodes[0].nodeType&&this.simpleText(a))},breakWord:function(a,b,c){var d=a.split(" ");if(d.pop(),c&&d.pop(),!b)return d[d.length-1]&&(d[d.length-1]=d[d.length-1].replace(/(,$)/g,"").replace(/(\.$)/g,"")),d.push(this.conf.ellipsis),d.join(" ");if(d[d.length-1])return d[d.length-1]=d[d.length-1].replace(/(,$)/g,"").replace(/(\.$)/g,""),d.push(this.conf.ellipsis),[d.join(" "),b];if(!d[d.length-1]&&b){var e=" "+b.trim().replace(/(,$)/g,"").replace(/(\.$)/g,"")+" ";return d.push(this.conf.ellipsis),[d.join(" "),e]}},simpleText:function(a){for(var b=a.childNodes[0].nodeValue;this.prop.height>this.prop.lineheight*this.lines.current;)a.childNodes[0].nodeValue=b.slice(0,-1),b=a.childNodes[0].nodeValue;this.conf.break_word?(a.childNodes[0].nodeValue=b.slice(0,-this.conf.ellipsis.length)+this.conf.ellipsis,this.isNotCorrect()&&(a.childNodes[0].nodeValue=" "+a.childNodes[0].nodeValue.slice(0,-(this.conf.ellipsis.length+1)).trim().slice(0,-this.conf.ellipsis.length)+this.conf.ellipsis)):(a.childNodes[0].nodeValue=this.breakWord(a.childNodes[0].nodeValue),this.isNotCorrect()&&(a.childNodes[0].nodeValue=this.breakWord(a.childNodes[0].nodeValue,null,!0)))},isNotCorrect:function(){return this.prop.height>this.prop.lineheight*this.lines.current},processBreak:function(a,b,c){var d=this.breakWord(a.innerText||a.nodeValue,b.innerText||b.nodeValue,c);a.innerText?a.innerText=d[0]:a.nodeValue=d[0],b.innerText?b.innerText=d[1]:b.nodeValue=d[1]},handleChildren:function(a){for(var b,c=a.childNodes,d=c.length-1;d>=0;d--){var e;if(8!==c[d].nodeType){if(3===c[d].nodeType?(e=c[d].nodeValue,c[d].nodeValue=""):(e=getComputedStyle(c[d]).getPropertyValue("display"),c[d].style.display="none"),this.prop.height<=this.prop.lineheight*this.lines.current){if(3===c[d].nodeType){for(c[d].nodeValue=e,b=c[d].nodeValue;this.prop.height>this.prop.lineheight*this.lines.current;)c[d].nodeValue=b.slice(0,-1),b=c[d].nodeValue;if(this.conf.break_word){if(c[d].nodeValue=b.slice(0,-this.conf.ellipsis.length)+this.conf.ellipsis,this.isNotCorrect()){if(c[d].nodeValue=" "+c[d].nodeValue.slice(0,-this.conf.ellipsis.length).trim().slice(0,-this.conf.ellipsis.length),!(c[d].nodeValue.length>1))continue;c[d].nodeValue=c[d].nodeValue.slice(0,-this.conf.ellipsis.length)+this.conf.ellipsis}}else{if(!c[d].innerText&&!c[d].nodeValue)continue;if(this.processBreak(c[d],c[d-1]),this.isNotCorrect()&&(this.processBreak(c[d],c[d-1],!0),this.isNotCorrect())){a.removeChild(c[d]);continue}}}else{for(c[d].style.display=e,b=c[d].innerText;this.prop.height>this.prop.lineheight*this.lines.current;)c[d].innerText=b.slice(0,-1),b=c[d].innerText;if(this.conf.break_word){if(c[d].innerText=b.slice(0,-this.conf.ellipsis.length)+this.conf.ellipsis,this.isNotCorrect()){if(c[d].innerText=" "+c[d].innerText.slice(0,-this.conf.ellipsis.length).trim().slice(0,-this.conf.ellipsis.length),!(c[d].innerText.length>1))continue;c[d].innerText=c[d].innerText.slice(0,-this.conf.ellipsis.length)+this.conf.ellipsis}}else{if(!c[d].innerText&&!c[d].nodeValue)continue;if(this.processBreak(c[d],c[d-1]),this.isNotCorrect()&&(this.processBreak(c[d],c[d-1],!0),this.isNotCorrect())){a.removeChild(c[d]);continue}}}break}a.removeChild(c[d])}}}};var m=function(b){return new a(b)};"function"==typeof define&&define.amd&&define("ellipsis",[],function(){return m}),self.Ellipsis=m}();