封装两个简单的Jquery组件
Jquery给我们提供了很大的方便,我们把他看成是一个公共库,以致在这个公共库上延伸出了很多Jquery插件;在项目过程中,有些插件总是不那么令人满意;
主要说两个项目用途:
1、 遮罩层,跟一般的遮罩层不一样,我需要实现的是对某一个元素进行局部遮罩;
2、 冒泡提示,网上有很多,我需要的只是一种在页面指定位置弹出来的一个静止定位的div而已;两个就自己了;
首先说下jquery插件开发的简单思路与几个操作方法
/*产生随机数*/
; (function ($) {
$.Random = function (under, over) {
switch (arguments.length) {
case 1: return parseInt(Math.random() * under + 1);
case 2: return parseInt(Math.random() * (over - under + 1) + under);
default: return 0;
}
}
})(jQuery);
1、 我们一般在写一个公共方法时会在前面定义一个”;”,在网上看到有人说这是书写习惯,其实这个一种容错机制,有点sql中go的意思,就是把上面的代码跟自己的这个扩展插件给分开,因为插件是被引入到页面,如果这个插件上面有错误,且别人忘记以”;”结尾,那么我们写的这个插件就会受到影响,所以加上开头的分号;
2、 分号后面在定义一个匿名的函数,并且闭包,传入一个jQuery参数进去,就完成一个jquery插件的基本定义;
 ; (function ($) {
  })(jQuery);
3、 插件的主体就是我们的功能处理块;一般我们使用的jquery的时候,有两种情况
a、$.ajax(option);这种是属于jquery本身提供的方法
b、$(“”).each(option);这种是属于jquery对象提供的方法
我们上面的两个需求中,第一个需求是进行局部遮罩,就需要知道是遮罩那个页面元素了,显示就需要封装一个jquery对象方法;
先完成第一个需求
 ; (function ($) {
     $.fn.extend({
         loading: function (option, param) {
          }
     });
 })(jQuery);
因为我们是封装到对象上的方法,所以使用$.fn.extend(opiotn)将我们的loading函数累加到$.fn上面,写完这些就可以在js中使用$(“#div1”).loading(option,param);进行调用了;
还有一个最重要的东西就是参数的合并;一个插件肯定是可以灵活配置的,当然我们也应该默认的提供一个看上去可以使用的页面参数;
在定义完$.fn.extend后,接着定义默认值:
 $.fn.loading.defaults = {
     loadingText: "loading", //加载时要显示的文字
         loadingHide: false,   //原来的遮罩层是否需要隐藏
         opacity: 0.6,  //透明度
         bgColor: "black",  //遮罩层的背景色
         fontColor: "#fff"  //遮罩层中的color
     }
默认值有了后,我们还需要将我们自定义的参数给传进来,比如我们的调用
$("#div4").loading({ loadingText: "加载用户信息中,请稍后" });
Juery给我们提供了一个方式用来合并相关参数
option = $.extend($.fn.loading.defaults, option);
这个option就是默认参数+我们传进来的自定义参数合并后的结果了;
其实这个比较简单,就是因为我们知道要遮罩层的对象,然后进行创建一个div在需要被遮罩的div的上方就可以;
$this.position().top;可以得到传进来的div距离浏览器上方的高度
$this.position().left; 可以得到传进来的div距离浏览器左边的宽度
给遮罩层赋值,就是给offset(option)进行赋值,赋值方式,可以参考w3cschool上的示例;
$("#" + loadingId).offset(function (n, c) {
                newPos = new Object();
                newPos.left = left;
                newPos.top = top;
                return newPos;
            })
基本在此就已经封装完了整个插件;现在在遮罩层的基础上在加一个需求,比如在已经弹出的遮罩层的基础上在次改变遮罩层的相关属性,比如文字,颜色等;
我们用过一些jquery组件都会提供事件和方法
比如我们在使用jquery.easyui的时候,事件在定义在option中,就可以在符合条件时触发,
我们在option里面加入一个参数就可以做到
onLoadSuccess:null
//调用回调 //在符合条件的时候回调一下即可
if (option.onLoadSuccess != null) {
option.onLoadSuccess("这是参数");
}
方法的写法如下:
  loading: function (option, param) {
             var $this = this;
             if (typeof option == 'string') {
                 switch (option) {
                     case 'setLoadingText':
                         return this.each(function () {
                             var id = $this.attr("id");
                             var loadingId = id + "Loading";
                             $("#" + loadingId + "span").html(param);
                         });
                 }
             }
 }
 //调用
  $("#div1").loading("setLoadingText","系统错误,请与管理员联系");
我刚开始以为要用到jquery里面的什么提供的方式,其实很简单,判断下option是不是string,如果是就是方法的调用;我们在使用jquery的时候,一定是要将当前对象给each一下,因为我们有可能不止选择一个对象,而是多个;
同样的冒泡提示也是如此,只是用$.tips=function(option,param)即可
下面贴出代码:
 ; (function ($) {
     $.fn.extend({
         loading: function (option, param) {
             var $this = this;
             if (typeof option == 'string') {
                 switch (option) {
                     case 'hide':
                         return this.each(function () {
                             var id = $this.attr("id");
                             var loadingId = id + "Loading";
                             $("#" + loadingId).hide().detach();
                             if ($("#" + id).css("display") == "none") {
                                 $("#" + id).show();
                             }
                         });
                     case 'setLoadingText':
                         return this.each(function () {
                             var id = $this.attr("id");
                             var loadingId = id + "Loading";
                             $("#" + loadingId + "span").html(param);
                         });
                 }
             }
             var setting = {
                 loadingText: "loading",
                 loadingHide: false,
                 opacity: 0.6,
                 bgColor: "black",
                 fontColor: "#fff",
                 onLoadSuccess:null
             }
             var top = $this.offset().top;
             var left = $this.offset().left;
             var height = $this.height();
             var width = $this.width();
             //合并参数
             option = $.extend($.fn.loading.defaults, option);
             var id = $this.attr("id");
             var loadingId = id + "Loading";
             var divHtml = "<div  id='" + loadingId
                 + "' style='background-color:" + option.bgColor
                 + ";opacity:" + option.opacity
                 + ";display:none;text-align:center;position:absolute;color:" + option.fontColor
                 + ";' data-isHide='false'><span id='" + loadingId
                 + "span'>" + option.loadingText + "</span></div>";
             if ($("#" + loadingId).length > 0) {
                 var isHide = $("#" + loadingId).attr("data-isHide");
                 if (isHide) {   //如果是显示的话
                     return this;
                 } else {
                     $("#" + loadingId).remove();
                 }
             }
             //将loadingdiv插入页面中
             $this.before(divHtml);
             //计算居中的padding值
             var loadingHeight = $("#" + loadingId).height();
             var paddingTop = height / 2 - loadingHeight;
             //判断原来的div是不是要隐藏
             if (option.loadingHide) {
                 $this.hide();
             }
             $("#" + loadingId).offset(function (n, c) {
                 newPos = new Object();
                 newPos.left = left;
                 newPos.top = top;
                 return newPos;
             }).height(height - paddingTop).width(width).show();
             //居中
             $("#" + loadingId).css("padding-top", paddingTop + "px");
             //调用回调
             if (option.onLoadSuccess != null) {
                 option.onLoadSuccess("这是参数");
             }
         }
     });
 })(jQuery);
遮罩层
效果图:

 ; (function ($) {
         $.Tips = function (option, param) {
             if (typeof(option) == 'string') {
                 switch(option){
                     case "setText":
                         setText(param);
                         break;
                     case "setHtml":
                         setHtml(param);
                         break;
                     case "hideTips":
                         hideTips(param);
                         break;
                     case "hideTipsAll":
                         hideTipsAll();
                         break;
                 }
                 return;
             }
             function setText(param) {
                 $("#" + param.id + "span").text(param.text);
             }
             function setHtml(param) {
                 $("#" + param.id + "span").html(param.html);
             }
             function hideTips(param) {
                 $("#" + param.id).remove();
             }
             function hideTipsAll() {
                 $(".tips-MessTips").remove();
             }
             var setting = {
                 id: 'auto',
                 width: 300,
                 height: 20,
                 backgroundColor: "rgb(217, 237, 247)",
                 left: 'auto',
                 top: 20,
                 tipMess: '正在加载中,请稍后',
                 iconImg: '../Content/MyCustom/images/info16.png',
                 time: 3
             }
             var documentWidth = $(document).width();
             var documentHeight = $(document).height();
             //合并参数
             option = $.extend(setting, option);
             if (option.left = 'auto') {
                 var tipWidth = option.width;
                 if (typeof (option.width) == "string") {
                     tipWidth = documentWidth *parseFloat(option.width)/100;
                 }
                 option.left = (documentWidth - tipWidth) / 2;
             } else if (typeof (option.left) == "string" && option.left.indexOf("%") > 0) {
                 option.left = option.left * parseFloat(option.left) / 100;
             }
             if (typeof (option.top) == "string" && option.top.indexOf("%") > 0) {
                 option.top = option.top * parseFloat(option.top) / 100;
             }
             if (typeof (option.width) == "string" && option.width.indexOf("%") > 0) {
                 option.width = documentWidth * parseFloat(option.width) / 100;
             }
             if (typeof (option.height) == "string" && option.height.indexOf("%") > 0) {
                 option.height = documentHeight * parseFloat(option.height) / 100;
             }
             if (option.id == 'auto') {
                 option.id = 'tips' + $.Random(0, 999999999);
             }
             option.time = option.time * 1000;
             var htmlDiv = '<div class=" tips-MessTips" id="' + option.id
                         + '" '
                         + 'style="display:none;overflow:hidden;border-color:#bce8f1;color:#3a87ad;left: ' + option.left
                         + 'px; top: ' + option.top
                         + 'px; width: ' + option.width
                         + 'px; height: ' + option.height
                         + 'px; position: fixed; background-color:' + option.backgroundColor
                         + ';"><img src="' + option.iconImg
                         + '" /><span id="' + option.id
                         + 'span">' + option.tipMess
                         + '</span></div>'
             //如果已经存在的DIV
             if ($("#" + option.id).length > 0) {
                 $("#" + option.id + "span").html(option.tipMess);
                 return;
             }
             //如果还没有一个tip
             if ($(".tips-MessTips").length == 0) {
                 $("body").append(htmlDiv);
             } else {
                 $(".tips-MessTips").each(function () {
                     $(this).offset(function (n, c) {
                         newPos = new Object();
                         newPos.left = $(this).offset().left;
                         newPos.top = $(this).offset().top + option.height;
                         return newPos;
                     })
                 });
                 $(".tips-MessTips").first().before(htmlDiv);
             }
             if (option.time > 0) {
                 setTimeout(
                     function () {
                         $("#" + option.id).remove();
                     }, option.time);
             }
             //显示当前的窗口
             return $("#" + option.id).show();
         };
     })(jQuery);
Tips
效果图
会在指定时间消失,多个自动往下排列
封装两个简单的Jquery组件的更多相关文章
- 【转】简单的jQuery插件开发方法
		
在实际开发工作中,总会碰到像滚动,分页,日历等展示效果的业务需求,对于接触过jQuery以及熟悉jQuery使用的人来说,首先想到的肯定是寻找现有的jQuery插件来满足相应的展示需求.目前页面中常用 ...
 - 【SSH进阶之路】一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)
		
文件夹 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器開始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入 ...
 - Jquery(一) 初识Jquery,简单使用Jquery。
		
距离上一篇博文好像隔了很久的时间了额.好像是堕落了一阵子,前些时间去杭州找工作,被租房的事情给搞懵逼了,然后就回来了,回来在修炼一个月在出去奋斗把!加油,这两天把jquery,easyui和boots ...
 - React Native封装Toast与加载Loading组件
		
React Native开发封装Toast与加载Loading组件 在App开发中,我们避免不了使用的两个组件,一个Toast,一个网络加载Loading,在RN开发中,也是一样,React Nati ...
 - uniapp自定义简单省市区联动组件
		
又双叒一个uniapp组件 最近有一个选择地址的需求,就写了一个省市区联动选择器. 选择日期使用的picker,就照着它简单的整了一个,使用网络请求城市数据,还用到了vuex组件数据共享. 本来自己整 ...
 - 封装Vue Element的table表格组件
		
上周分享了几篇关于React组件封装方面的博文,这周就来分享几篇关于Vue组件封装方面的博文,也好让大家能更好地了解React和Vue在组件封装方面的区别. 在封装Vue组件时,我依旧会交叉使用函数式 ...
 - 基于Bootstrap的DropDownList的JQuery组件的完善版
		
在前文 创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件 中,实现了DropDownList的JQuery组件,但是留有遗憾.就是当下拉菜单出现滚动条的时候,滚动条会覆 ...
 - 一个简单的jQuery插件开发实例
		
两年前写的一个简单的jQuery插件开发实例,还是可以看看的: <script type="text/javascript" src="jquery-1.7.2.m ...
 - [.Net Core] 在 Mvc 中简单使用日志组件
		
在 Mvc 中简单使用日志组件 基于 .Net Core 2.0,本文只是蜻蜓点水,并非深入浅出. 目录 使用内置的日志组件 简单过渡到第三方组件 - NLog 使用内置的日志 下面使用控制器 Hom ...
 
随机推荐
- C++“窗体”程序设计启蒙
			
[摘要]本文以C++菜菜鸟(仅仅须要学习了C++数据类型和控制结构就可以)为目标读者,用求解一元二次方程作为实例,展示窗体式程序的开发过程,获得初步体验.写作目的包含:(1)让学生通过模仿,开发出类似 ...
 - Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)
			
原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...
 - 【智能家居篇】wifi网络访问原理(下一个)——联想Association
			
转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 认证完毕后,下一步就是关联(Association). 工作站与基站进行关联.以便获得网络的全然訪问权. 关联属于一 ...
 - ubuntu下一个rootusername入口mysql,如何查看username和password,如何改变rootpassword
			
mysql -u root -p 按Enter键,提示时输入密码access denied......ues password YES/NO错误. 第一步: 然后,你需要输入/etc/mysql夹.然 ...
 - [Error]EOL while scanning string literal
			
有一个经常性的工作项目.需要一天的一些表数据到外部接口,但最近总是异常.今天检查的原因. 第一本地和测试环境中测试程序是没有问题,有网络环境只会在日志中抛出一个异常.产生主要的例外是推定异常数据. , ...
 - Atitit.软体guibuttonand面板---通信子系统(范围)-- github 采用....
			
Atitit.软体guibuttonand面板---通讯子系统(区)-- github 的使用.... 1. 1.注冊账户以及创建仓库 1 2. 二.在GitHub中创建项目(create a new ...
 - C语言字符串函数大全
			
C语言字符串函数大全 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include ...
 - background-position 具体的使用说明
			
语法: background-position : length || length background-position : position || position 值: length : ...
 - oracle_SQL 实验查询及删除重复记录 依据条件 (row)
			
除数据库表中的重复记录 根据条件 ① 创建表准备数据 创建表 tab_test -- Create table create table TAB_TEST ( ID NUMBER, NAME NVAR ...
 - The Swift Programming Language-官方教程精译Swift(9) 枚举-- --Enumerations
			
枚举定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值. 如果你熟悉 C 语言,你就会知道,在 C 语言中枚举指定相关名称为一组整型值.Swift 中的枚举更加灵活 ...