自定义jQuery扩展

时间:2021-08-15 19:58:44

项目中js往往会有些比较常用的函数,这时就可以把这些函数封装到一起。如果项目使用jQuery则可以封装成jQuery的扩展。jQuery扩展一般有两种方式,一种是对jQuery本身的扩展,一种是jQuery对象的扩展。

jQuery本身的扩展即把函数封装在jQuery名称空间下,通过jQuery.funcName的形式调用。如:jQuery.ajax({param1:value1,param2,value2[,...]});

jQuery对象的扩展,即扩展到jQuery查找到DOM后的对象下,通过jQuery("#divId").funcName的形式调用。如:$("#selectID").appendTo("body"); //$为jQuery的别名

封装的代码如下:

  1 /**
  2  * 项目常用函数封装,扩展到jQuery下,函数名以'_'线开头区别于jQuery本身的函数
  3  * 类方法调用:
  4  *     $.functionName( param1[, param2[, param3, ...] ] );
  5  *     $._trim( "abcdef", "f" ); //去除字符串首尾的'f'
  6  * 对象方法调用:
  7  *     jQueryObj.functionName( param1[, param2[, param3, ...] ] );
  8  *     $("#img")._alignCenter(); //弹窗居中
  9  *
 10  * 常用函数:
 11  *     1.  $._trim( string[, char] ); //去除字符串首尾的空格(包括全角空格),或特殊字符
 12  *     2.  $._rtrim( string[, char] ); //去除字符串右侧的空格(包括全角空格),或特殊字符
 13  *     3.  $._strLen( string ); //获取字符串长度,一个中文算两个字节
 14  *     4.  $._cutStr( string[, len[, replace]] ); //截取字符串
 15  *     5.  $._urlParams( [name] ); //获取url中的参数
 16  *     6.  $._stopProp( e ); //阻止冒泡传递
 17  *     7.  $._date( str[, c]); //获取当前日期
 18  *     8.  $._addMask( [bColor[, zindex]] ); //添加遮罩
 19  *     9.  $._removeMask(); //移除遮罩
 20  *     10. $._formData( id[, boolean] ); //获取form表单提交的值
 21  *     11. $._cookie( [name[, value[, options]]] ); //获取设置cookie的值
 22  *     12. $._removeCookie( name ); //移除cookie
 23  *     13. $._ajaxPage( fn, params[, pageId] ); //ajax分页
 24  *     16. $._html2Entity( str ); //html转实体
 25  *     17. $._entity2Html( str ); //实体转html
 26  *     20. $._mousePos( e ); //获取当前鼠标位置
 27  *     
 28  *     22. _alignCenter( [offset[, bool[, style]]] ); //弹窗居中显示
 29  *     23. _dragHandle( dragId[, cursor] ); //拖动弹窗
 30  *     24. _checkTextArea( limitObj, len ); //检查textarea的字数
 31  */
 32 (function($, document) {
 33     //扩展jQuery类本身的方法,$为传入的jQuery对象
 34     $.extend({
 35         /**
 36          * 功能:去除字符串两端的空格或指定字符
 37          * @param     string        str       字符串
 38          * @param     char          c         需要去除的字符,不填为去除空格
 39          * @return    string        字符串
 40          */
 41         _trim: function(str, c) {
 42             if (!str)
 43                 return "";
 44             var re1 = !c ? /(^\s*)|(\s*$)/g : eval("/(\^" + c + ")|(" + c + "\$)/g"),
 45                     re2 = /(^[\u3000]*)|([\u3000]*$)/g;
 46             if (!c) {
 47                 return str.replace(re1, "").replace(re2, "");
 48             }
 49             return str.replace(re1, "");
 50         },
 51         
 52         /**
 53          * 功能:去除字符串右端的空格或指定字符
 54          * @param     string        str       字符串
 55          * @param     char          c         需要去除的字符,不填为去除空格
 56          * @return    string        字符串
 57          */
 58         _rtrim: function(str, c) {
 59             if (!str)
 60                 return "";
 61             var re1 = !c ? /(\s*$)/g : eval("/(" + c + "\$)/g"),
 62                     re2 = /[\u3000]*$/g;
 63             if (!c) {
 64                 str.replace(re1, "").replace(re2, "");
 65             }
 66             return str.replace(re1, "");
 67         },
 68         
 69         /**
 70          * 功能:获取字符串长度,一个中文算两个字节,其它一个字节。
 71          * @param     string        str        字符串
 72          * @return    int           字符串长度(字节大小)
 73          */
 74         _strLen: function(str) {
 75             if (!str)
 76                 return 0;
 77             return str.replace(/[^\x00-\xff]/g, "aa").length;
 78         },
 79         
 80         /**
 81          * 功能:截取字符串,默认截取20个字符(一个中文算2个字符),超出默认用'...'表示。
 82          * @param     string        str     要截取的字符串,必须
 83          * @param     int           len     要截取的字节长度,默认20个字符
 84          * @param     string        r       末尾替代字符,默认'...'
 85          * @return    string        字符串
 86          */
 87         _cutStr: function(str, len, r) {
 88             if (!str)
 89                 return "";
 90             len = len || 20;
 91             r = r === "" ? "" : "...";
 92             if ($._strLen(str) <= len) {
 93                 return str;
 94             }
 95             for (var i = 0, l = 0, sLen = str.length, c; i < sLen; i++) {
 96                 c = encodeURI(str.charAt(i));
 97                 if (c === "%0A" || c === "%20" || c === "%7C") {
 98                     l += 1;
 99                 } else {
100                     c.length > 2 ? l += 2 : l += 1;
101                 }
102                 if (l >= len) {
103                     return l == len ? str.substr(0, i + 1) + r : str.substr(0, i) + r;
104                 }
105             }
106             return str;
107         },
108         
109         /**
110          * 功能:获取url中的参数。(有待优化,增加多个参数值获取)
111          * @param     string         name     参数名称,不填获取所有参数
112          * @return    string|obj     参数不为空返回指定参数的值,参数为空时返回所有参数
113          *                           {param1:value1, param2:value2, ...}
114          */
115         _urlParams: function(name) {
116             var url = $._trim(location.href.split("?").pop()).toLowerCase();
117             if (!url)
118                 return null;
119             name = name ? name.toLowerCase() : "";
120             var arr = url.split("&"), a, p, re = {};
121             if (arr[0].split("=").length < 2)
122                 return null; //没有参数返回
123             for (var i = 0, l = arr.length; i < l; i++) {
124                 a = arr[i].split("=");
125                 if (name == a[0]) {
126                     p = a[1];
127                 } else {
128                     re[a[0]] = a[1];
129                 }
130             }
131             if (!name)
132                 return re;
133             return p;
134         },
135         
136         //阻止冒泡(事件传递)
137         _stopProp: function(e) {
138             e = e || window.event;
139             if (e.stopPropagation) {
140                 e.stopPropagation();//W3C阻止冒泡方法
141             }
142             else {
143                 e.cancelBubble = true;//IE阻止冒泡方法  
144             }
145             return false;
146         },
147         
148         /**
149          * 功能:获取当前日期,不填参数获取完整的时间,格式'2013-12-22 06:20:21'。
150          * @param    string        str     时间格式:
151          *                                 y输出4位年份,如:2013
152          *                                 ym输出年月,如:201312
153          *                                 ymd输出年月日,如2013-12-20
154          * @param    char          c       分割符,默认'-'
155          * @return    string        当前日期
156          */
157         _date: function(str, c) {
158             var myDate = new Date(), //创建日期对象
159                     yyyy = myDate.getFullYear(), //获取完整的年份(4位,1970-????)
160                     mm = myDate.getMonth() + 1, //获取当前月份(0-11,0代表1月)
161                     dd = myDate.getDate(), //获取当前日(1-31)
162                     hh = myDate.getHours(), //获取当前小时数(0-23)
163                     ii = myDate.getMinutes(), //获取当前分钟数(0-59)
164                     ss = myDate.getSeconds();    //获取当前秒数(0-59)
165             mm = mm > 9 ? mm : "0" + mm;
166             dd = dd > 9 ? dd : "0" + dd;
167             hh = hh > 9 ? hh : "0" + hh;
168             ii = ii > 9 ? ii : "0" + ii;
169             ss = ss > 9 ? ss : "0" + ss;
170             str = str ? str.toLowerCase() : "";
171             c = c || "-";
172             switch (str) {
173                 case "y":
174                     return yyyy;
175                 case "ym":
176                     return yyyy + c + mm;
177                 case "ymd":
178                     return yyyy + c + mm + c + dd;
179                 default:
180                     return yyyy + c + mm + c + dd + " " + hh + ":" + ii + ":" + ss;
181             }
182         },
183         
184         /**
185          * 功能:获取form表单中提交的值。
186          * @param     object         obj
187          * @param     boolean        bool    返回的数据类型,默认返回json数据,若为true则返回string格式字符串
188          * @return    string|obj     默认返回json数据,json对像{param1:param1Value, param2:param2Value, ...}
189          *                           若bool=true则返回string类型的值格式:'param1=value1&param2=value2...',
190          */
191         _formData: function(obj, bool) {
192             var obj, params = {};
193             if (typeof obj === "string") {
194                 obj = $("#" + obj)[0];
195             } else if (obj instanceof jQuery) {
196                 obj = obj[0];
197             }
198 
199             //返回string格式数据值
200             if (bool) {
201                 var str = "";
202                 for (var i = 0, l = obj.length; i < l; i++) {
203                     if (obj[i] !== null && obj[i].type !== "submit" && obj[i].type !== "button" && obj[i].type !== "reset") {
204                         str += obj[i].name;
205                         str += "=";
206                         str += obj[i].value === $(obj[i]).attr("placeholder") ? "" : obj[i].value;
207                         str += "&";
208                     }
209                 }
210                 str = $._rtrim(str, "&");
211                 return str;
212             }
213 
214             //返回json数据值
215             for (var i = 0, l = obj.length; i < l; i++) {
216                 if (obj[i] !== null && obj[i].type !== "submit" && obj[i].type !== "button" && obj[i].type !== "reset") {
217                     params[obj[i].name] = obj[i].value === $(obj[i]).attr("placeholder") ? "" : obj[i].value;
218                 }
219             }
220             return params;
221         },
222         
223         /**
224          * 功能:获取cookie值,设置cookie值
225          * @param     string     name       名称
226          * @param     string     value      名称对应的值,value为空时为获取cookie中的值,value不为空设置cookie值
227          * @param     Object     options    {expires:expires, path:path, domain:domain, secure:secure}
228          *                                   expires:过期时间(单位:天,expries=2为2天后失效),默认为空,关闭浏览器后cookie值失效
229          *                                   path:路径,path(如:/test/)下的所有页面共享该cookie,默认为空,当前目录
230          *                                   domain:域,域下面所有页面都共享该cookie,默认为空,当前目录
231          *                                   secure:安全,,默认为空不加密;若设置为"secure",将采用加密的https传递数据
232          * @return    string     cookie中的值
233          */
234         _cookie: function(name, value, options) {
235             //获取cookie中的值
236             if (value === undefined) {
237                 var cValue = {}, cookies, arr;
238                 if (document.cookie && document.cookie != "") {
239                     cookies = document.cookie.split(";");
240                     for (var i = 0, l = cookies.length; i < l; i++) {
241                         arr = cookies[i].split("=");
242                         if (name !== undefined && name == $.trim(arr[0])) {
243                             return decodeURIComponent(arr[1]);
244                         } else {
245                             cValue[arr[0]] = arr[1];
246                         }
247                     }
248                 }
249                 return name === undefined ? cValue : "";
250             }
251 
252             //设置cookie的值
253             else {
254                 var options = options || {}, expires = "", date, path, domain, secure;
255 
256                 //值为空时不设置cookie
257                 if (value === null) {
258                     return false;
259                 }
260                 if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
261                     if (typeof options.expires == 'number') {
262                         date = new Date();
263                         date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
264                     } else {
265                         date = options.expires;
266                     }
267                     expires = '; expires=' + date.toUTCString();
268                 }
269 
270                 path = options.path ? ";data-path=" + options.path : ""; //路径
271                 domain = options.domain ? ";domain=" + options.domain : ""; //
272                 secure = options.secure ? ";secure" : ""; //安全
273                 document.cookie = [name, "=", encodeURIComponent(value), expires, path, domain, secure].join("");
274             }
275         },
276         
277         /**
278          * 功能:删除cookie中指定的值
279          * @param     string         name      cookie中的值
280          */
281         _removeCookie: function(name) {
282             document.cookie = name + "=;expires=" + (new Date(0)).toGMTString();
283         },
284         
285         /**
286          * 功能:AJAX分页
287          * @param   function    fn      ajax提交后的回调函数    
288          * @param   object      params  提交参数
289          * @param   mix         pageId  分页按钮div的id
290          */
291         _ajaxPage: function(fn, params, pageId) {
292             params = params || {};
293             pageId = pageId || "Paginator";
294             var pageObj = typeof pageId === "string" ? $("#" + pageId) : pageId,
295                     aObj = pageObj.find("a"),
296                     des_page = pageObj.find("a.now_page").text(),
297                     l = aObj.length;
298             if (l <= 0) {
299                 return false;
300             }
301             params.url = params.url ? params.url : aObj[0].name.split("public").pop().split("&").shift(); //提交地址
302             params.maxPage = aObj[l - 2].innerHTML; //最大页
303             aObj.each(function() {
304                 $(this).bind("click", ajaxHandle);
305             });
306 
307             function ajaxHandle() {
308                 var $this = $(this);
309                 params.curr_page = $this.attr("name").split("=").pop();
310                 if (params.curr_page == des_page) {
311                     return false;
312                 }
313                 $this.removeAttr("href");
314                 //提交数据
315                 $.ajax({
316                     type: "POST",
317                     url: webServerPath + params.url,
318                     data: params,
319                     dataType: "json",
320                     beforeSend: function() {
321                         pageId === "Paginator" ? jQuery._loadingPop($("div.list-wrap").parent()) : jQuery._loadingPop(pageObj.parent());
322                     },
323                     success: function(data) {
324                         if (data.status == 100) {
325                             pageId === "Paginator" ? $("html,body").animate({scrollTop: 0}, 100) : $("html,body").animate({scrollTop: pageObj.parent().offset().top - 100}, 100);
326                             fn(data.msg);
327                         } else if (data.status == 200) {
328                             return false;
329                         } else if (data.status == 400) {
330                             eval(data.callback);
331                         }
332                     },
333                     complete: function() {
334                         $("#loadingPop").remove();
335                     }
336                 });
337             }
338         },
339         
340         //过滤字符,html标签转义为实体
341         _html2Entity: function(str) {
342             return str.replace(/[<>&"']/g, function(c) {
343                 return {'<': '&lt;', '>': '&gt;', '&': '&amp;', '"': '&quot;', "'": '&#039;'}[c];
344             });
345         },
346         
347         //实体转义为html标签
348         _entity2Html: function(str) {
349             var arrEntities = {'lt': '<', 'gt': '>', 'nbsp': ' ', 'amp': '&', 'quot': '"'};
350             return str.replace(/&(lt|gt|nbsp|amp|quot);/ig, function(all, t) {
351                 return arrEntities[t];
352             });
353         },
354         
355         //获取当前鼠标的坐标
356         _mousePos: function(e) {
357             var e = e || window.event, db = document.body, dd = document.documentElement;
358             return {
359                 x: e.clientX + db.scrollLeft + dd.scrollLeft,
360                 y: e.clientY + db.scrollTop + dd.scrollTop
361             };
362         },
363         
364         /**
365          * 功能:添加遮罩
366          * @param     string        style     遮罩的样式,默认黑色半透明
367          */
368         _addMask: function(style) {
369             var m = $("#mask");
370             if (m[0]) {
371                 return m.show();
372             }
373             var mask = $('<div id="mask" class="mask"></div>'),
374                     str = '<iframe style="width:' + window.screen.width + 'px;height:' + document.documentElement.scrollHeight +
375                     'px;position:fixed;filter:alpha(opacity=50);opacity:0.5;background-color:#000000;top:0px;left:0px;z-index:9999;' + style +
376                     '" src="' + webServerPath + '/js/iframe.htm" id="maskiframe_id" name="maskiframe_name"></iframe>';
377             return mask.html(str).appendTo("body");
378         },
379         
380         //移除遮罩
381         _removeMask: function() {
382             return $("#mask").remove();
383         }
384     });
385 
386     //扩展jQuery对象方法
387     $.fn.extend({
388         /**
389          * 功能:弹窗居中
390          * @param     mix           dragId    触发拖动的对象或对象id
391          * @param     int           offset     偏移量
392          * @param     boolean       bool       是否添加遮罩,false不添加,默认添加遮罩
393          * @param     string        style      遮罩样式
394          * @return    object  弹出层
395          */
396         _alignCenter: function(offset, bool, style) {
397             offset = offset || 0;
398             var l = document.body.scrollLeft + (document.body.clientWidth - this.width()) / 2, //div宽度
399                     t = document.body.scrollTop ? (document.documentElement.clientHeight - this.height()) / 2 - offset + document.body.scrollTop :
400                     (document.documentElement.clientHeight - this.height()) / 2 - offset + document.documentElement.scrollTop;
401             l = l < 0 ? 100 : l;
402             t = t < 0 ? 100 : t;
403             this.css("zIndex") < 10000 ? this.css({left: l + "px", top: t + "px", position: "absolute"}) :
404                     this.css({left: l + "px", top: t + "px", zIndex: 10000, position: "absolute"});
405             //添加遮罩
406             bool === false ? null : $._addMask(style);
407             return this;
408         },
409         
410         /**
411          * 功能:鼠标拖动div层
412          * @param string dragId     点击对象id
413          * @param string cursor     拖动时鼠标style
414          * @return object 拖动层
415          */
416         _dragHandle: function(dragId, cursor) {
417             cursor = cursor || "move";
418             var isMousedown = false, clickLeft = 0, clickTop = 0, $this = this,
419                     dragDom = typeof dragId === "string" ? $("#" + dragId).css("cursor", cursor)[0] : dragId.css("cursor", cursor)[0];
420             $this.css("zIndex") <= 9999 ? $this.css("zIndex", 10000) : null;
421 
422             //按下鼠标左键时的事件
423             function startDrag(e) {
424                 e = window.event || e;  // 获取当前事件对象
425                 isMousedown = true;  // 记录已经准备开始移动了
426                 clickLeft = e.clientX - $this.offset().left; // 获取鼠标与div左边的距离
427                 clickTop = e.clientY - $this.offset().top;   // 获取鼠标与div头部的距离
428                 document.onmouseup = endDrag;  // 鼠标释放事件
429                 document.onmousemove = doDrag; // 鼠标移动事件
430             }
431 
432             //鼠标开始移动时的事件
433             function doDrag(e) {
434                 e = window.event || e; // 获取当前事件对象
435                 if (!isMousedown) {
436                     return false; // 如果_IsMousedown不等于真了返回
437                 }
438                 // 计算偏移量
439                 var posX = e.clientX - clickLeft;
440 
441                 // left不能超过浏览器框架左右边界
442                 if (posX < 0) {
443                     posX = 0;
444                 } else if (posX > document.documentElement.clientWidth - $this.width()) {
445                     posX = document.documentElement.clientWidth - $this.width();
446                 }
447                 // top不能超过整个页面上下边界
448                 var posY = e.clientY - clickTop,
449                         documentY = document.body.clientHeight < document.documentElement.clientHeight ?
450                         document.documentElement.clientHeight : document.body.clientHeight;
451                 if (posY < 0) {
452                     posY = 0;
453                 } else if (posY > documentY - $this.height()) {
454                     posY = documentY - $this.height();
455                 }
456                 $this.css({left: posX + "px", top: posY + "px"});
457             }
458 
459             // 释放鼠标左键时的事件
460             function endDrag() {
461                 if (isMousedown) { // 如果_IsMousedown还为真那么就赋值为假
462                     if (navigator.appName == "Microsoft Internet Explorer") {
463                         $this[0].releaseCapture(); //该函数从当前的窗口释放鼠标捕获,并恢复通常的鼠标输入处理
464                     }
465                     isMousedown = false;
466                     document.onmousemove = null;
467                     document.onmouseup = null;
468                 }
469             }
470             dragDom.onmousedown = startDrag; // 鼠标按下事件
471             return $this;
472         },
473         
474         /**
475          * 功能:检查输入域中的字数
476          * @param   object  limitObj   提示字数div的jquery对象
477          * @param   int     len        限制长度
478          * @returns object  输入域textarea对象
479          */
480         _checkTextArea: function(limitObj, len) {
481             var lw = typeof limitObj === "string" ? $("#" + limitObj) : limitObj,
482                     wordLen = jQuery._strLen(jQuery._trim($(this).val()));
483             if (wordLen > len) {
484                 lw.html('已经超过<span class="f14" style="color:red;font-weight:bold;">' + Math.ceil((wordLen - len) / 2) + '</span>个字');
485             } else {
486                 lw.html('还能输入<span class="f14" style="font-weight:bold;">' + Math.ceil((len - wordLen) / 2) + '</span>个字');
487             }
488             return this;
489         }
490     });
491     
492 })(jQuery, document);
//初始还传入document,是因为封装的有些函数要多次调用document,将document对象保存到函数局部变量中,避免去全局查找。(function($, document))(jQuery,document);