通用代码积累
(function(win, doc, docEl) {
function setRem() {
var width = docEl.getBoundingClientRect().width;
var rem = width / 10;
win.rem = rem;
docEl.style.fontSize = rem + 'px';
}
setRem();
var remTimer;
win.addEventListener('resize', function() {
clearTimeout(remTimer);
remTimer = setTimeout(setRem, 300);
}, false);
})(window, document, document.documentElement)
Number.prototype.formatMoney = function (places, thousand, decimal) {
places = !isNaN(places = Math.abs(places)) ? places : 2;
thousand = thousand || ",";
decimal = decimal || ".";
var number = this,
negative = number < 0 ? "-" : "",
i = parseInt(number = Math.abs(+number || 0).toFixed(places), 10) + "",
j = (j = i.length) > 3 ? j % 3 : 0;
return negative + (j ? i.substr(0, j) + thousand : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousand) + (places ? decimal + Math.abs(number - i).toFixed(places).slice(2) : "");
};
/** * 获取字符串的真实长度 * @method getStrLeng * @param string str 目标字符串 * @return int 真实的长度值 */ function getStrLeng(str){ var realLength = 0; var len = str.length; var charCode = -1; var cn=en=0; for(var i = 0; i < len; i++){ charCode = str.charCodeAt(i); if (charCode >= 0 && charCode <= 128) { realLength += 1; en+=1; }else{ realLength += 2; cn+=1; } } return realLength; } /** * 判断指定字符或数字是否存在于目标数组中 * @method in_array * @param needle str|number 目标字符串 * @param haystack str|int 目标数组 * @return bool bool true,false */ function inArray(needle, haystack) { if(typeof needle == 'string' || typeof needle == 'number'){ for(var i in haystack){ if(haystack[i] == needle){ return true; } } } return false; } /** * 获取文本中的html指定字符替换成字符实体 * @method htmlEncode * @param string text 目标文本 * @return text 返回替换后的文本 */ function htmlEncode(text) { return !text ? text : String(text).replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, """); } /** * 获取文本中的html指定字符实体替换成字符 * @method htmlDecode * @param string text 目标文本 * @return text 返回替换后的文本 */ function htmlDecode(text) { return !text ? text : String(text).replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, '"'); } /** * 对字符串进行去空格处理 * @method utilsTrim * @param string text 目标文本 * @return text 返回去空格后的文本 */ function utilsTrim(text) { if (typeof(text) == "string") { return text.replace(/^\s*|\s*$/g, ""); } else { return text; } } /** * 判断指定值是否为空 * @method utilsIsEmpty * @param string val 目标值 * @return bool bool true,false */ function utilsIsEmpty(val) { switch (typeof(val)) { case 'string': return utilsTrim(val).length == 0 ? true : false; break; case 'number': return val == 0; break; case 'object': return val == null; break; case 'array': return val.length == 0; break; default: return true; } } /** * 判断指定值是否是数值 * @method utilsIsNumber * @param string val 目标值 * @return bool bool true,false */ function utilsIsNumber(val) { var reg = /^[\d|\.|,]+$/; return reg.test(val); } /** * 判断指定值是否是数字整型 * @method utilsIsInt * @param string val 目标值 * @return bool bool true,false */ function utilsIsInt(val) { if (val == "") { return false; } var reg = /\D+/; return !reg.test(val); } /** * 判断指定值是否是邮箱格式 * @method utilsIsEmail * @param string email 目标邮箱 * @return bool bool true,false */ function utilsIsEmail(email) { var reg = /([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)/; return reg.test(email); } /** * 判断指定值是否是手机号格式 * @method utilsIsMobile * @param string mobile 目标手机号码 * @return bool bool true,false */ function utilsIsMobile(mobile) { var reg = /^1[2|3|4|5|6|7|8|9][0-9]{9}$/; return reg.test(mobile); } /** * 判断指定值是否是身份证号格式 * @method utilsIsIdNumber * @param string idnumber 目标身份证号 * @return bool bool true,false */ function utilsIsIdNumber(idnumber) { var reg = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/; return reg.test(idnumber); } /** * 判断指定值是否是银行卡卡号格式 * @method utilsIsBankCardNumber * @param string bankcardnumber 目标卡号 * @return bool bool true,false */ function utilsIsBankCardNumber(bankcardnumber) { var reg = /^(\d{16}|\d{18}|\d{19})$/; return reg.test(bankcardnumber); } /** * 判断指定值是否是汉字格式 * @method utilsIsChineseCharacters * @param string str 目标字符 * @return bool bool true,false */ function utilsIsChineseCharacters(str) { var reg = /^([\u4e00-\u9fa5]){2,20}$/; return reg.test(str); } /** * 银行卡格式输出,每4个字符进行空格 * @method bankCardNumberFormat * @param string value 目标卡号 * @return string 转换格式后的卡号 */ function bankCardNumberFormat(value) { var v = value.replace(/\s+/g, '').replace(/[^0-9]/gi, ''); var matches = v.match(/\d{4,19}/g); var match = matches && matches[0] || ''; var parts = []; for (i=0, len=match.length; i<len; i+=4) { parts.push(match.substring(i, i+4)); } if (parts.length) { return parts.join(' '); } else { return value; } } /** * 点击按钮触发秒数倒计时 * @method countDownSecondClickBtn * @param int secondtime 倒计时的描述 * @param string btnId 按钮的id属性 * @param string beforeBtnClickStr 按钮初始话内容 * @param string allowClickClass 允许重新触发的class * @param string forbidClickClass 禁止重新触发的class * @return null */ function countDownSecondClickBtn(secondtime, btnId, beforeBtnClickStr, allowClickClass, forbidClickClass ) { var btn = $('#'+btnId); var hander = setInterval(function () { if (time <= 0) { btn.attr("class",allowClickClass); btn.html(beforeClickStr); clearInterval(hander); }else{ btn.attr("class",forbidClickClass); btn.html(time--); } }, 1000); } /** * 判断是否是微信浏览器 * @method isWeixinBrowser * @return bool bool true,false */ function isWeixinBrowser() { var ua = navigator.userAgent.toLowerCase(); if ( ua.indexOf('micromessenger') != -1 ) { return true; }else{ return false; } } /** * 当前页面刷新 * @method refreshPage * @param int secondtime 倒计时的描述 * @param string btnId 按钮的id属性 * @param string beforeBtnClickStr 按钮初始话内容 * @param string allowClickClass 允许重新触发的class * @param string forbidClickClass 禁止重新触发的class * @return null */ function refreshPage() { var cur_url = window.location.href; var url_arr = cur_url.split('?'); if( isWeixinBrowser() ){ //微信内部的浏览器刷新 window.location.href = url_arr+"?j="+10000 * Math.random(); }else{ window.location.reload(); } return false; }
// "true" => true 392 // "false" => false 393 // "null" => null 394 // "42" => 42 395 // "42.5" => 42.5 396 // JSON => parse if valid 397 // String => self 398 399 function deserializeValue(value) { 400 var num 401 try { 402 return value ? value == "true" || (value == "false" ? false : value == "null" ? null : !isNaN(num = Number(value)) ? num : /^[\[\{]/.test(value) ? $.parseJSON(value) : value) : value 403 } catch (e) { 404 return value 405 } 406 }
@media only screen and (max-width:640px){html{font-size:100px;}} @media only screen and (max-width:414px){html{font-size:64.6875px;}} @media only screen and (max-width:375px){html{font-size:58.5938px;}} @media only screen and (max-width:360px){html{font-size:56.25px;}} @media only screen and (max-width:320px){html{font-size:50px;}}
/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block} audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}template,[hidden]{display:none} a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:0;text-decoration:underline;text-decoration:underline dotted} b,strong{font-weight:inherit}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%} sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}svg:not(:root){overflow:hidden} code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0} optgroup{font-weight:bold}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button} button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0} button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText} fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal} textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto} [type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none} ::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}
// 根据屏幕宽度控制字体大小 (function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function() { var clientWidth = docEl.clientWidth; if (!clientWidth) return; docEl.style.fontSize = 26 * (clientWidth / 750) + 'px'; }; if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); doc.addEventListener('DOMContentLoaded', recalc, false); })(document, window);
//根据浏览器的宽自动分配body的字号 var clientWidth; (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function () { // if (docEl.style.fontSize) return; clientWidth = docEl.clientWidth; //alert(clientWidth); clientWidth = clientWidth>750?750:clientWidth; clientWidth = clientWidth<320?320:clientWidth; if (!clientWidth) return; docEl.style.fontSize =100 * (clientWidth / 750) + 'px'; if (document.body) { document.body.style.fontSize = docEl.style.fontSize; } }; recalc(); if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); doc.addEventListener('DOMContentLoaded', recalc, false); })(document, window);
(function (doc, win) { //取得html的引用 var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function () { var clientWidth = docEl.clientWidth; if (!clientWidth) return; clientWidth = (clientWidth > 768 ) ? 768 : clientWidth ; docEl.style.fontSize = 100 * (clientWidth / 375 ) + 'px'; }; if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); recalc(); })(document, window);
//designWidth:设计稿的实际宽度值,需要根据实际设置 //maxWidth:制作稿的最大宽度值,需要根据实际设置 //这段js的最后面有两个参数记得要设置,一个为设计稿实际宽度,一个为制作稿最大宽度,例如设计稿为750,最大宽度为750,则为(750,750) (function(designWidth, maxWidth) { var doc = document, win = window, docEl = doc.documentElement, remStyle = document.createElement("style"), tid; function refreshRem() { var width = docEl.getBoundingClientRect().width; maxWidth = maxWidth || 540; width>maxWidth && (width=maxWidth); var rem = width * 100 / designWidth; remStyle.innerHTML = 'html{font-size:' + rem + 'px !important;}'; } if (docEl.firstElementChild) { docEl.firstElementChild.appendChild(remStyle); } else { var wrap = doc.createElement("div"); wrap.appendChild(remStyle); doc.write(wrap.innerHTML); wrap = null; } //要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次; refreshRem(); win.addEventListener("resize", function() { clearTimeout(tid); //防止执行两次 tid = setTimeout(refreshRem, 300); }, false); win.addEventListener("pageshow", function(e) { if (e.persisted) { // 浏览器后退的时候重新计算 clearTimeout(tid); tid = setTimeout(refreshRem, 300); } }, false); if (doc.readyState === "complete") { doc.body.style.fontSize = "16px"; } else { doc.addEventListener("DOMContentLoaded", function(e) { doc.body.style.fontSize = "16px"; }, false); } })(750, 750);
(function(){ var newFont = function(){ // alert(window.innerWidth); var win = window.innerWidth > 640 ? 640 : window.innerWidth; var num = win/320; document.documentElement.style.fontSize = 16*num+'px'; } newFont(); window.onresize = newFont; window.jsAct = ''; var pressX = 0, pressY = 0; document.addEventListener('touchmove',function(e){ if (e.targetTouches.length == 1) { var touch = event.targetTouches[0]; var spanY = touch.pageY - pressY; // alert(spanY); if (spanY > 0 && document.body.scrollTop <= 0) { e.preventDefault(); // location.reload(); return false; } } }); document.addEventListener('touchstart', function(event) { // 如果这个元素的位置内只有一个手指的话 if (event.targetTouches.length == 1) { var touch = event.targetTouches[0]; // 把元素放在手指所在的位置 pressX = touch.pageX; pressY = touch.pageY; // touchStart.value = pressX + ';' + pressY; } }, false); })();
(function flexible (window, document) { var docEl = document.documentElement var dpr = window.devicePixelRatio || 1 // adjust body font size function setBodyFontSize () { if (document.body) { document.body.style.fontSize = '16px' } else { document.addEventListener('DOMContentLoaded', setBodyFontSize) } } setBodyFontSize() // set 1rem = viewWidth / 10 function setRemUnit () { var rem = docEl.clientWidth / 10 docEl.style.fontSize = rem + 'px' } setRemUnit() // reset rem unit on page resize window.addEventListener('resize', setRemUnit) window.addEventListener('pageshow', function (e) { if (e.persisted) { setRemUnit() } }) // detect 0.5px supports if (dpr >= 2) { var fakeBody = document.createElement('body') var testElement = document.createElement('div') testElement.style.border = '.5px solid transparent' fakeBody.appendChild(testElement) docEl.appendChild(fakeBody) if (testElement.offsetHeight === 1) { docEl.classList.add('hairlines') } docEl.removeChild(fakeBody) } }(window, document))
(function($) { /** * 对Jquery扩展方法 */ $.extend(jQuery,{ /** * 从c参数中复制所有配置属性到o参数中 * * @param o 被复制的对象 * @param c 要复制的对象 * @param defaults 如果存在不同对象是,将该对象也复制到o参数中 */ apply:function(o, c, defaults) { if(defaults){ $.apply(o, defaults); } if(o && c && typeof c === 'object'){ for(var p in c){ o[p] = c[p]; } } return o; }, /** * 如果o参数对象没有该属性时,从c参数中复制所有配置属性到o参数中。 * * @param o 被复制的对象 * @param c 要复制的对象 */ applyIf:function(o, c){ if(o){ for(var p in c){ if(!$.isDefined(o[p])){ o[p] = c[p]; } } } return o; }, /** * 在一个数组中遍历调用方法,返回调用方法后的新数组, * <pre> * $.invoke(Ext.query("p"), "getAttribute", "id"); * 返回 [el1.getAttribute("id"), el2.getAttribute("id"), ..., elN.getAttribute("id")] * </pre> * * @param arr 待调用方法的数组 * @param methodName 要执行的方法名称 */ invoke : function(arr, methodName){ var ret = [], args = Array.prototype.slice.call(arguments, 2); $.each(arr, function(i,v) { if (v && typeof v[methodName] == 'function') { ret.push(v[methodName].apply(v, args)); } else { ret.push(undefined); } }); return ret; }, escapeRe : function(s) { return s.replace(/([-.*+?^${}()|[\]\/\\])/g, "\\$1"); }, /** * 重写某个类,当方法名相同时候会覆盖当前类的方法,当方法名不存在时,将会添加到类中,属性也一样 * * <pre> * $.override(MyClass, { * newMethod1: function(){ * // etc. * }, * newMethod2: function(foo){ * // etc. * } * }); * </pre> * * @param origclass 要重写的类 * @param overrides 重写方法或者属性的对象 */ override : function(origclass, overrides){ if(overrides){ var p = origclass.prototype; $.apply(p, overrides); if(overrides.hasOwnProperty('toString')){ p.toString = overrides.toString; } } }, /** * 判断一个值或对象是否为空 * * @param v 要判断的值 * @param allowBlank true 为允许字符串为''值 */ isEmpty: function(v, allowBlank){ return v === null || v === undefined || (($.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false); }, /** * 判断一个值或对象是否不为空 * * @param v 要判断的值 * @param allowBlank true 为允许字符串为''值 */ isNotEmpty : function(v, allowBlank){ return !$.isEmpty(v, allowBlank); }, /** * 判断一个值是否日期类(Date)型 * * @param v 要判断的值 */ isDate : function(v){ return toString.apply(v) === '[object Date]'; }, /** * 判断一个值是否对象([object:object])类型 * * @param v 要判断的值 */ isObject : function(v){ return !!v && Object.prototype.toString.call(v) === '[object Object]'; }, /** * 判断一个值是否String类型 * * @param v 要判断的值 */ isString : function(v){ return typeof v === 'string'; }, /** * 判断一个值是否Boolean类型 * * @param v 要判断的值 */ isBoolean : function(v) { return typeof v === 'boolean'; }, /** * 判断一个值是否HTML元素 * * @param v 要判断的值 */ isElement : function(v) { return v ? !!v.tagName : false; }, /** * 判断一个值是否已经定义 * * @param v 要判断的值 */ isDefined : function(v){ return typeof v !== 'undefined'; }, /** * 判断一个HTML是否为隐藏状态 * * @param v 要判断的值 */ isHide:function(el){ return $(el).css("display") === "none" || $(el).css("visibility") === "hidden"; }, /** * 判断一个值是否是整型,如果是返回当前值,如果不是返回defaultValue参数的值 * * @param v 要判断的值 * @param defaultValue 如果不是整型将要返回的值, * @param replaceStr 要删除某些String类型的字符 */ number:function(v,defaultValue,replaceStr){ if (v == "auto") { v = 0; } if ($.isString(v) && v.length > 0) { v = v.replaces(replaceStr,"").replace(" ",""); } if ($.isEmpty(v) || $.isArray(v) || $.isBoolean(v)) { v = NaN; } v = Number(v); return isNaN(v) ? defaultValue : v; }, /** * 如果v参数值为空,返回defaultValue参数值。 * * @param v 值 * @param defaultValue 如果值为空将要返回的值 * @param allowBlank true表示允许值为''值 */ value : function(v, defaultValue, allowBlank){ return $.isEmpty(v, allowBlank) ? defaultValue : v; }, /** * 如果value参数值超过指定长度,截断字符串并添加一个省略号("…")到结束的位置中 * * <pre> * $.ellipsis("123456789",5) * 返回:12345... * </pre> * * @param value 值 * @param len 要截取的长度 * @param word 省略字符,默认为... * * @return String */ ellipsis : function(value, len, word) { if (value && value.length > len) { if (word) { var vs = value.substr(0, len - 2), index = Math.max(vs.lastIndexOf(' '), vs.lastIndexOf('.'), vs.lastIndexOf('!'), vs.lastIndexOf('?')); if (index == -1 || index < (len - 15)) { return value.substr(0, len - 3) + "..."; } else { return vs.substr(0, index) + "..."; } } else { return value.substr(0, len - 3) + "..."; } } return value; }, /** * 将json符串转换为json 对象 * * @param json json 字符串 * @param useNative 是否使用浏览器常规的转换方式,true表示是,false表示不是,默认为:false * * @returns Object */ parseJSON:function(json,useNative) { if ($.isObject(json)) { return json; } if (useNative) { return JSON.parse(json); } return eval("(" + json + ')'); }, /** * 空方法 */ emptyFn:function () {} }); /** * 对JS Function类扩展 */ $.applyIf(Function.prototype, { /** * 对某个参数创建一个拦截器方法,如果拦截器方法返回false时,将不会调用要执行的方法,如果返回true时调用要执行的方法 * <pre> * var sayHi = function(name){ * alert('Hi, ' + name); * } * * sayHi('Fred'); // alerts "Hi, Fred" * * // 创建拦截器 * // 如果name==Brian后在执行sayHi方法 * var sayHiToFriend = sayHi.createInterceptor(function(name){ * return name == 'Brian'; * }); * * sayHiToFriend('Fred'); // no alert * sayHiToFriend('Brian'); alerts "Hi, Brian" * </pre> * * @param fcn 拦截器方法 * @param scope 拦截器方法的作用域 */ createInterceptor : function(fcn, scope){ var method = this; return !$.isFunction(fcn) ? this : function() { var me = this, args = arguments; fcn.target = me; fcn.method = method; return (fcn.apply(scope || $ , args) !== false) ? method.apply(me, args) : null; }; }, /** * 通过arguments[0], arguments[1], arguments[2],创建一个callback方法来将参数传递到要执行的方法中 * * <pre> * var sayHi = function(name){ * alert('Hi, ' + name); * } * * * sayHi.createCallback('Fred') //alerts "Hi, Fred" * </pre> */ createCallback : function(){ var args = arguments, method = this; return function() { return method.apply($, args); }; }, /** * 创建一个委托回调,将obj作为当前方法的作用域去执行方法体里的代码,可以通过args参数来对该方法的要接受的参数进行传递 * * <pre> * var sayHi = function(name){ * alert('Hi, ' + name); * } * * * sayHi.createDelegate(window,["Fred"]) //alerts "Hi, Fred" * </pre> * * @param obj 作用域 * @param args 传递的参数 * @param appendArgs 如果为true args参数将不会覆盖原有方法的参数值 */ createDelegate : function(obj, args, appendArgs){ var method = this,slice = Array.prototype.slice; return function() { var callArgs = args || arguments; if (appendArgs === true){ callArgs = slice.call(arguments, 0); callArgs = callArgs.concat(args); }else if ($.isNumeric(appendArgs)){ callArgs = slice.call(arguments, 0); var applyArgs = [appendArgs, 0].concat(args); slice.apply(callArgs, applyArgs); } return method.apply(obj || $, callArgs); }; }, /** * 类似setTimeout方法,该方法执行时间的同时,可以把方法的作用域以及参数传递的方法体中 * * <pre> * var sayHi = function(name){ * alert('Hi, ' + name); * } * * // 执行方法: * sayHi('Fred'); * * // 两秒中后执行方法: * sayHi.defer(2000, this, ['Fred']); * </pre> * * @param millis 等待多用毫秒执行该方法 * @param obj 作用域 * @param args 要传递的参数 * @param appendArgs 如果为true args参数将不会覆盖原有方法的参数值 * */ defer : function(millis, obj, args, appendArgs){ var fn = this.createDelegate(obj, args, appendArgs); if(millis > 0){ return setTimeout(fn, millis); } fn(); return 0; } }); /** * 重写String类属性 */ $.applyIf(String.prototype, { /** * 去除空格 * @returns string */ trim : function () { return this.replace(/(^\s*)|(\s*$)/g, ""); }, /** * 通过占位符格式化字符串 * <pre> * "1{0}3{1}5".messageFormat("2","4"); * 返回:12345 * </pre> * */ messageFormat : function(){ var args = []; for(var i = 0 ; i < arguments.length ; i++){ args.push(arguments[i]); } return this.replace(/\{(\d+)\}/g, function(m, i){ return args[i]; }); }, /** * * 通过字符串数组替换字符串,返回替换后的字符串, * * @param array 替换字符串数组 * @param arg 要替换的值 * * @return String **/ replaces:function(array,arg) { var temp = this.toString(); if ($.isNotEmpty(array) && $.isArray(array)) { for (var i = 0; i < array.length; i++) { var str = array[i]; if ($.isString(str)) { temp = temp.replace(array[i],arg); } } } return temp; }, /** * 如果value等于当前值,返回当前值,反则返回other参数的值 */ toggle:function(value, other){ return this.toString() == value ? other : value; }, /** * 如果当前值的长度小于size参数的长度是,将当前值从左边开始补位. * * <pre> * "123".leftPad(5,"00"); * 返回:"00123" * </pre> * * @param size 要判断的长度 * @param ch 要不为的字符 */ leftPad : function (size, ch) { var val = this.toString(); var result = String(val); if(!ch) { ch = " "; } while (result.length < size) { result = ch + result; } return result; }, /** * 如果当前值超过指定长度,截断字符串并添加一个省略号("…")到结束的位置中 * * <pre> * "123456789".ellipsis(5) * 返回:12345... * </pre> * * @param len 要截取的长度 * @param word 省略号,默认为 "..." */ ellipsis:function(len, word){ return $.ellipsis(this.toString(),len,word); }, /** * 将当前值转换为boolean类型 * * <pre> * "1".booleanValue() 返回:true * "0".booleanValue() 返回false * "true".booleanValue() 返回 true * "false".booleanValue() 返回 false * "abc".booleanValue("abc") 返回 true * "abc".booleanValue("aaa") 返回 false * </pre> * * @param compareValue 自定义比对值 */ booleanValue:function(compareValue){ var value = this.toString(); return $.isNotEmpty(value) && (value === "true" || value === "1" || ($.isNotEmpty(compareValue) || value == compareValue)); }, /** * 将当前值转换为数字类型 * * @returns number */ numberValue:function() { var value = this.toString(); return $.isNotEmpty(value) ? value * 1 : value; } }); /** * 重写 Date 对象, 添加 format 函数 */ $.applyIf(Date.prototype,{ /** * * 格式化日志 * * @param format 格式化字符串 * * @returns string */ format : function (format) { //author: meizz var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "h+": this.getHours(), //小时 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(format)) format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return format; } }); /** * 扩张数组属性 */ $.applyIf(Array.prototype, { /** * 在当前数组中遍历寻找o对象,如果相等返回当前所在数组的未知,返回返回-1 * * @o 要遍历寻找的对象 * @from 从第几位开始遍历 */ indexOf : function(o, from){ var len = this.length; from = from || 0; from += (from < 0) ? len : 0; for (; from < len; ++from){ if(this[from] === o){ return from; } } return -1; }, /** * 从当前数组中删除对象 * * @param o 要删除的对象 */ remove : function(o){ var index = this.indexOf(o); if(index != -1){ this.splice(index, 1); } return this; }, /** * 将数组添加到本数组中 * * @param o 数组 */ addAll:function(o) { if ($.isEmpty(o) && !$.isArray(o) && o.length < 0) { return ; } for(var i = 0; i < o.length; i++) { this.push(o[i]); } } });
if (!NeuF) var NeuF = {}; NeuF.ScrollPage = function (obj, options, callback) { var _defaultOptions = { delay: 500, marginBottom: 100 }; //默认配置:延迟时间delay和滚动条距离底部距离marginBottom options = $.extend(_defaultOptions, options); this.isScrolling = false; //是否在滚动 this.oriPos = 0; //原始位置 this.curPos = 0; //当前位置 var me = this; //顶层 var $obj = (typeof obj == "string") ? $("#" + obj) : $(obj); //绑定滚动事件 $obj.scroll(function (ev) { me.curPos = $obj.scrollTop(); if ($(window).height() + $(window).scrollTop() >= $(document.body).height() - options.marginBottom) { if (me.isScrolling == true) return; me.isScrolling = true; setTimeout(function () { me.isScrolling = false; }, options.delay); //重复触发间隔毫秒 if (typeof callback == "function") callback.call(null, me.curPos - me.oriPos); }; me.oriPos = me.curPos; }); };
下载通用代码js:
downloadFile(filePath: any) { this.meetingService.downloadFile(filePath, rtv => { if (rtv) { let _blob = new Blob([rtv]); let _filename = filePath.substring(filePath.lastIndexOf('_') + 1); if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(_blob, _filename); } else { let _link = document.createElement('a'); let _url = window.URL.createObjectURL(_blob); document.body.appendChild(_link); _link.setAttribute('style', 'display:none'); _link.href = _url; _link.download = _filename; _link.click(); window.URL.revokeObjectURL(_url); _link.remove(); } } else { alert('下载失败,请稍后重试!'); } }); }
相对父元素区域(1920*1080)下的拖动代码:
const handleMousedown = (e: any) => { e.target.style.cursor = 'move' document.onmousemove = e => { const maxX = 1920 - templateRender.width //元素宽 const maxY = 1080 - templateRender.height //元素高
//xPos yPos 元素相对定位元素left right const x = ~~(templateRender.xPos + e.movementX / 0.222875) //父元素设置了 zoom:0.222875 const y = ~~(templateRender.yPos + e.movementY / 0.221875) templateRender.xPos = x > maxX ? maxX : x < 0 ? 0 : x templateRender.yPos = y > maxY ? maxY : y < 0 ? 0 : y } document.onmouseup = () => { e.target.style.cursor = 'auto' document.onmousemove = document.onmouseup = null } }