Jquery Easy UI 实现页面的Loading效果(类似于Android的ProgressDialog)

前言

很常用的一种前端效果,比如当用户点击网页的某个按钮发送了一条异步请求,如果响应时间过长容易导致用户重复点击,一方面影响用户体验一方面容易造成不必要的服务端压力,Easy UI有现成的mask样式,简单封装一下就可以使用,之前查阅搜集了相关资料和文章,发现都介绍的都不是很完整,所以本篇blog就完整的记录一下通过Easy UI快速实现这种效果以及如何集成到项目中。

引入、封装和调用

首先当然是在我们的项目中集成jquery以及easyui的相关资源包,除了jquery的核心js文件,easyui的话一般也不需要完整的包,除了核心js文件之外根据需求保留部分即可,我在项目中的目录文件是:

接下来就是在jsp页面中引入js和css了:

<!-- jquery core -->
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery/jquery-1.8.0.min.js"></script>
<!-- easyui -->
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/js/easyui/themes/default/easyui.css">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/easyui/jquery.easyui.min.js"></script>
<script language="javascript"  src="${pageContext.request.contextPath}/js/easyui/locale/easyui-lang-zh_CN.js"></script>

接下来就是核心的js代码了,新建一个common.js,将mask的样式以及操作封装成一个MaskUtil对象:

var MaskUtil = (function(){  

    var $mask,$maskMsg;  

    var defMsg = '正在处理,请稍待。。。';  

    function init(){
        if(!$mask){
            $mask = $("<div class=\"datagrid-mask mymask\"></div>").appendTo("body");
        }
        if(!$maskMsg){
            $maskMsg = $("<div class=\"datagrid-mask-msg mymask\">"+defMsg+"</div>")
                .appendTo("body").css({'font-size':'12px'});
        }  

        $mask.css({width:"100%",height:$(document).height()});  

        $maskMsg.css({
            left:($(document.body).outerWidth(true) - 190) / 2,top:($(window).height() - 45) / 2,
        });   

    }  

    return {
        mask:function(msg){
            init();
            $mask.show();
            $maskMsg.html(msg||defMsg).show();
        }
        ,unmask:function(){
            $mask.hide();
            $maskMsg.hide();
        }
    }  

}());  

可以看到,在初始化时,我们定义了2个div,第一个div设置了easyui的datagrid-mask样式,即通过设置整个页面的透明度来达到“遮蔽”的那种效果,在easyui.css可以找到这个样式:

.datagrid-mask {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  opacity: 0.3;
  filter: alpha(opacity=30);
  display: none;
}

而第二个div设置了datagrid-mask-msg样式,即是我们居中的小dialog窗体,并通过一行文字来进行提示,同样的看看它的css样式:

.datagrid-mask-msg {
  position: absolute;
  top: 50%;
  margin-top: -20px;
  padding: 12px 5px 10px 30px;
  width: auto;
  height: 16px;
  border-width: 2px;
  border-style: solid;
  display: none;
}

可以看到我们封装的这个MaskUtil对象提供了2个方法:mask和unmask,显而易见,一个显示Loding,另一个是隐藏Loading,这样只要我们在页面引入了common.js,我们就可以方便的调用这两个方法来实现Loding效果了。

关于如何调用想必大家都已经很清楚了,我们都会选择在耗时任务开始的时候开启mask,当得到服务端响应的时候结束mask,完全类似于Android中的处理方式,比如我们在Activity中new一个ProgressDialog,一般在工作线程开启或者AsynTask execute时show dialog,而当异步任务结束时会在onPostExecute方法中再调用dialog.dismiss().

在web中依然是类似的,我们可以在$.ajax方法之前调用MaskUtil.mask()去开启Loding,而在ajax的success或者error的回调方法中再调用MaskUtil.unmask()来隐藏Loding,比如我在项目中就是这样写的:

function getExportExcel2() {
	MaskUtil.mask();
	$.ajax({
		url : '../../app/studentInfo/getExportStudentInfoExcelTwo',
		method : 'post',
		cache : false,
		success : function(data) {
			MaskUtil.unmask();
			if ("ok" == data.data) {
				if (confirm("导出成功,是否立即下载?")) {
					var fileName = data.fileName;
					window.location.href = "../../filedown/" + fileName
							+ ".zip";
				}
			}
		}
	});
}

是不是一目了然,我觉得不用做过多说明了,最后看一下效果图:

当点击“导出Excel”按钮即可看到上图效果,当服务端响应成功之后Loding效果会自动取消。但仔细和Android的ProgressDialog比较一下不难发现少了一个动态的圆形进度条,Android中的ProgressDialog作为一个标准的UI控件是自带圆形进度条的,它通过setTitle和setMessage来设置Loding的标题和内容,而easyui的mask其实也是自带这种效果的,但是需要一张gif图片,我们只需要把loading.gif这张图片拷贝到easyui的themes-default-images目录下即可,这张gif图可以在下载好的easyui包中找到,即这样一张图:

将这张图拷贝到上面说的目录之后,清理一下浏览器缓存,刷新页面,再次点击“导出Excel”按钮,即可看到如下的效果图:

这次就可以完美的看到我们的Loading效果了。

总结

本篇blog记录了web中Loading的一种较为简单和常用的解决方案,核心js文件来自网络,我仅仅做了部分分析并且和Android中的ProgressDialog做了比较,以后我也会把项目中遇到的比较好的功能总结一下写到blog中,边学习边总结,边总结边积累,哪怕只有一点点也是进步。加油,Raito!

时间: 2024-10-03 02:05:30

Jquery Easy UI 实现页面的Loading效果(类似于Android的ProgressDialog)的相关文章

JQuery Easy Ui (Tree树)详解

在这里沉重悼念我辛辛苦苦写了4个小时的文章,因为我的失误,没保存,而夭折啦..... 我的痛苦谁能懂? 哎~~~~  吃一见长一智吧! 么的办法啊! 但是,但是!我狠了狠心,咬了咬牙!我决定,再写一遍!!! 谁知道哭的表情怎么写! 我已经无法用言语表达我此时此刻的沉重心情了! (以下内容,身为菜鸟的我是用颤抖的双手敲出来的,忘同志们珍惜!!!!) 记得4个小时之前,我写过一个随笔,它的内容是这样的: 每次写博客,都喜欢在前面和大家分享一些东西,今天要分享的是一个小故事: 一个世界著名的大酒店正在

jQuery Easy UI Panel(面板)组件

panel(面板)组件,跟前面的组件用法几乎都差不多,也是从设置一些面板属性.操作面板触发的事件.我们可针对面板对象的操作方法这三个点去学习. 后面有一些组件要依赖于这个组件. 还有一点跟前面不同的就是面板内容可以请求远程数据. 示例: <!DOCTYPE html> <html> <head> <title>jQuery Easy UI</title> <meta charset="UTF-8" /> <s

JQuery Easy Ui (Tree树)详解(转)

JQuery Easy Ui (Tree树)详解(转) 第一讲:JQuery Easy Ui到底是什么呢? 首先咱们知道JQuery是对Java Script的封装,是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等.. JQuery ui是在jQuery的基础上,利用jQuery的扩展性,设计的插件. 那么JQuery Easy Ui到底是什么呢? 我的理解就是比JQuery ui更强大,同样都是实现绚丽的多功能效果! jQuery Easy UI的目的就是帮助Web开发者更轻松的打

jquery easy ui 1.5最新版本 简单的权限分配

jquery easy 1.5 Maven+servlet+jsp+jdbc实现权限管理分配 首先,我先说明下,我只是一个菜鸟,我只是在编程道路上摸索的一个的小码农.做开发三年了,这好像是我第一次写博客.以前接触过类似于jquery easy  ui 的DWZ,是我第一家公司用的UI框架.所以用easy ui感觉很快能上手.都是基于jquery 的ui框架.好,废话少说.此次项目我是用最基础的jsp+servlet+jdbc写的,同时加入了maven管理jar包以及发布.应该很好理解的. 1.准

jQuery Easy UI Tooptip(提示框)组件

我们都知道DOM节点的title属性,Tooptip组件就是比较强大的title,它可以自由的设置自己的样式.位置以及有自己相关的触发事件. 示例: <!DOCTYPE html> <html> <head> <title>jQuery Easy UI</title> <meta charset="UTF-8" /> <script type="text/javascript" src=&

jQuery Easy UI LinkButton(按钮)组件

LinkButton(按钮)组件,easyui基础组件之一 示例: <!DOCTYPE html> <html> <head> <title>jQuery Easy UI</title> <meta charset="UTF-8" /> <script type="text/javascript" src="easyui/jquery.min.js"></s

jQuery Easy UI ProgressBar(进度条)组件

ProgressBar(进度条)组件,这个还是挺好玩的,我们在自己做点什么的时候经常能用到,比如上传下载文件.导入导出文档啊.载入网页等等. 应用场景很多,使用起来还很简单. 示例: <!DOCTYPE html> <html> <head> <title>jQuery Easy UI</title> <meta charset="UTF-8" /> <script type="text/javas

jQuery Easy UI (适应屏幕分辨率大小)布局(Layout)

一.jQuery Easy UI (适应屏幕分辨率大小)布局(Layout) 1.首先应用的是jquery-easyui-1.4 版本(版本不同,兼容性不同) 2.实现整个页面的布局( layout: north,south,west,east, center) 3.首先整个页面布局适应屏幕的分辨率大小 4.然后内容区域进行布局,也要适应屏幕分辨率大小 5.部分代码: 1 <body> 2 <div class="easyui-layout" fit="tr

Jquery Easy UI初步学习(三)数据增删改

第二篇只是学了加载用datagrid加载数据,数据的增删改还没有做,今天主要是解决这个问题了. 在做增删改前需要弹出对应窗口,这就需要了解一下EasyUi的弹窗控件. 摘自:http://philoo.cnblogs.com/ 我的理解,就是panel有的属性Window.dialog都有,同时保留自己的扩展属性方法 , 所以主要展示pannel的属性. Pannel 属性 名称 类型 说明 默认值 title string 显示在Panel头部的标题文字. null iconCls strin