- 浏览: 1471488 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
背景:
遗留项目中用了 dwr 1.1 ,修 bug 看了看 DWRUtil.useLoadingMessage 有问题,修正后再看 dwr 2.0 ,3.0 rc1的 useLoadingMessage 实现,也不是很完美,改进下
dwr:
在 ajax 应用中,在同服务器通信的同时显示当前运行状态,可以达到很好的用户体验,如 经典的 Gmail loading :
dwr 作为整合后端的 ajax 框架,很早的就考虑到了这个问题,提供了useLoadingMessage ( 底层依靠prehook 与 posthook
) 使得用户可以介入 xhr 请求的发送过程中去,这个机制对所有的请求统一考虑,可以一次设置,每次请求都应用。但是dwr 的实现不是很完美。
dwr 1.1
function(message) { var loadingMessage; if (message) { loadingMessage = message; } else { loadingMessage = "Loading"; } DWREngine.setPreHook(function() { var disabledZone = $("disabledZone"); if (!disabledZone) { disabledZone = document.createElement("div"); disabledZone.setAttribute("id", "disabledZone"); disabledZone.style.position = "absolute"; disabledZone.style.zIndex = "1000"; disabledZone.style.left = "0px"; disabledZone.style.top = "0px"; disabledZone.style.width = "100%"; disabledZone.style.height = "100%"; document.body.appendChild(disabledZone); var messageZone = document.createElement("div"); messageZone.setAttribute("id", "messageZone"); messageZone.style.position = "absolute"; messageZone.style.top = "0px"; messageZone.style.right = "0px"; messageZone.style.background = "red"; messageZone.style.color = "white"; messageZone.style.fontFamily = "Arial,Helvetica,sans-serif"; messageZone.style.padding = "4px"; disabledZone.appendChild(messageZone); var text = document.createTextNode(loadingMessage); messageZone.appendChild(text); } else { $("messageZone").innerHTML = loadingMessage; disabledZone.style.visibility = "visible"; } }); DWREngine.setPostHook(function() { $("disabledZone").style.visibility = "hidden"; }); }
问题:
1.disableZone ie 下百分比大小不能正常设置
2.当多个同时请求发生时,当一个请求返回则 loadingMessage 就被 hidden ,而其实后面的请求还没回来,当前总体状态应为 loading 。
dwr 2.0
function(message) { var loadingMessage; if (message) { loadingMessage = message; } else { loadingMessage = "Loading"; } dwr.engine.setPreHook(function() { var disabledZone = dwr.util.byId("disabledZone"); if (!disabledZone) { disabledZone = document.createElement("div"); disabledZone.setAttribute("id", "disabledZone"); disabledZone.style.position = "absolute"; disabledZone.style.zIndex = "1000"; disabledZone.style.left = "0px"; disabledZone.style.top = "0px"; disabledZone.style.width = "100%"; disabledZone.style.height = "100%"; document.body.appendChild(disabledZone); var messageZone = document.createElement("div"); messageZone.setAttribute("id", "messageZone"); messageZone.style.position = "absolute"; messageZone.style.top = "0px"; messageZone.style.right = "0px"; messageZone.style.background = "red"; messageZone.style.color = "white"; messageZone.style.fontFamily = "Arial,Helvetica,sans-serif"; messageZone.style.padding = "4px"; disabledZone.appendChild(messageZone); var text = document.createTextNode(loadingMessage); messageZone.appendChild(text); dwr.util._disabledZoneUseCount = 1; } else { dwr.util.byId("messageZone").innerHTML = loadingMessage; disabledZone.style.visibility = "visible"; dwr.util._disabledZoneUseCount++; } }); dwr.engine.setPostHook(function() { dwr.util._disabledZoneUseCount--; if (dwr.util._disabledZoneUseCount == 0) { dwr.util.byId("disabledZone").style.visibility = "hidden"; } }); }
新增了一个属性 _disabledZoneUseCount 记录了当前还没处理完毕的请求个数,只有在所有请求处理完毕后才隐藏 loadingMessage 。
问题:
1.disableZone ie 下百分比大小不能正常设置
2.loadingMessage 定位为absolute ,当页面很长出现滚动条时,则当用户在页面底部操作时会出现loadingMessage 仍在文档顶部窗口之外的现象,合适的做法应该是用 fixed 定位,但是 ie6 不支持,但对ie6合适的做法应为 绝对定位到 scrollTop 坐标处即可。
dwr 3.0 rc1 基本等同 dwr 2.0
function(message) { var loadingMessage; if (message) { loadingMessage = message; } else { loadingMessage = "Loading"; } dwr.engine.setPreHook(function() { var disabledZone = dwr.util.byId("disabledZone"); if (!disabledZone) { disabledZone = document.createElement("div"); disabledZone.setAttribute("id", "disabledZone"); disabledZone.style.position = "absolute"; disabledZone.style.zIndex = "1000"; disabledZone.style.left = "0px"; disabledZone.style.top = "0px"; disabledZone.style.width = "100%"; disabledZone.style.height = "100%"; if (window.ActiveXObject) { disabledZone.style.background = "white"; disabledZone.style.filter = "alpha(opacity=0)"; } document.body.appendChild(disabledZone); var messageZone = document.createElement("div"); messageZone.setAttribute("id", "messageZone"); messageZone.style.position = "absolute"; messageZone.style.top = "0px"; messageZone.style.right = "0px"; messageZone.style.background = "red"; messageZone.style.color = "white"; messageZone.style.fontFamily = "Arial,Helvetica,sans-serif"; messageZone.style.padding = "4px"; document.body.appendChild(messageZone); var text = document.createTextNode(loadingMessage); messageZone.appendChild(text); dwr.util._disabledZoneUseCount = 1; } else { dwr.util.byId("messageZone").innerHTML = loadingMessage; disabledZone.style.visibility = "visible"; dwr.util._disabledZoneUseCount++; dwr.util.byId("messageZone").style.visibility = "visible"; } }); dwr.engine.setPostHook(function() { dwr.util._disabledZoneUseCount--; if (dwr.util._disabledZoneUseCount == 0) { dwr.util.byId("disabledZone").style.visibility = "hidden"; dwr.util.byId("messageZone").style.visibility = "hidden"; } }); }
我的改进:
可用闭包将当前active的请求封在小作用域内,判断ie6 绝对定位到scrollTop,而对于高级浏览器则直接fixed定位,另外 ie disableZone 百分比大小不起作用,改做每次都算一下,完美解决:
(function(){ var ua = navigator.userAgent.toLowerCase(); //judge ie6 var isIE6=/msie 6/.test(ua); // number of activeRequests var activeRequests=0; //disable zone var disabledZone; //loading message zone var messageZone DWRUtil.useLoadingMessage = function(message) { var loadingMessage; if (message) { loadingMessage = message; } else { loadingMessage = "Loading"; } DWREngine.setPreHook(function() { var fixTop=(isIE6?(document.documentElement.scrollTop || (document.body.scrollTop || 0)):0)+"px"; var fixWidth=(document.documentElement.scrollWidth || (document.body.scrollWidth || 0))+"px"; var fixHeight=(document.documentElement.scrollHeight || (document.body.scrollHeight || 0))+"px"; if (!disabledZone) { disabledZone = document.createElement("div"); disabledZone.setAttribute("id", "disabledZone"); disabledZone.style.position = "absolute"; disabledZone.style.zIndex = "10001"; disabledZone.style.left = "0px"; disabledZone.style.top = "0px"; //ie 100% can not work disabledZone.style.width = fixWidth; disabledZone.style.height = fixHeight; //ie opacity if (window.ActiveXObject) { disabledZone.style.background = "#cccccc"; disabledZone.style.filter = "alpha(opacity=30)"; } document.body.appendChild(disabledZone); messageZone = document.createElement("div"); messageZone.setAttribute("id", "messageZone"); if(isIE6) { messageZone.style.position = "absolute"; } else { messageZone.style.position = "fixed"; } messageZone.style.top = fixTop; messageZone.style.right = "0px"; messageZone.style.background = "red"; messageZone.style.color = "white"; messageZone.style.fontFamily = "Arial,Helvetica,sans-serif"; messageZone.style.padding = "4px"; document.body.appendChild(messageZone); var text = document.createTextNode(loadingMessage); messageZone.appendChild(text); } else { disabledZone.style.width = fixWidth; disabledZone.style.height = fixHeight; messageZone.style.top = fixTop; messageZone.innerHTML = loadingMessage; disabledZone.style.visibility = "visible"; messageZone.style.visibility = "visible"; } ++activeRequests; }); DWREngine.setPostHook(function() { --activeRequests; if(!activeRequests) { disabledZone.style.visibility = "hidden"; messageZone.style.visibility = "hidden"; } }); }; })();
发表评论
-
continuation, cps
2013-09-12 16:49 2859起 随着 nodejs 的兴起,异步编程成为一种潮流 ... -
一种基于匹配回朔的 css3 选择器引擎实现
2013-05-07 20:40 3431一种基于匹配回朔的 css3 选择器引擎实现 介绍 C ... -
cubic-bezier 模拟实现
2013-01-05 16:34 14133cubic-bezier 曲线是 css3 动画的一个重要基石 ... -
构建前端 DSL
2012-10-11 22:10 5417目前在传统的软件开 ... -
Get cursor position and coordinates from textarea
2012-04-10 20:50 5105最近需要从 textarea 中获 ... -
兼容 ie 的 transform
2012-02-23 14:00 6465css 2d transform 是 css3 引入的一个新的 ... -
promise api 与应用场景
2012-02-07 17:34 7427promise 是 commonjs 社区中提出的异步规范,其 ... -
closure compiler 代码优化实例
2012-01-08 03:23 2859closure compiler 可以进行不少有意思的优化 ... -
write html parser
2011-12-01 02:48 2943首先需要声明 html 不能用正则表达式来直接匹配进行内容抽取 ... -
获取剪贴板数据
2011-11-07 23:31 6475兼容性: 获取剪贴板数据这块各个浏览器间存在很大的 ... -
url 映射问题
2011-11-07 21:52 3239背景 url mapping 我最早知道是作为 j ... -
tip:如何原生播放声音
2011-10-19 12:45 2991如果不想考虑浏览器间 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2887简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2860场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2277分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7113作为前端开放的基础安全保证,caja 是目前比较合 ... -
tokenization of html
2011-08-29 22:38 2802html 符号解析问题 场景: 在页面上输出包 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2496这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
循环引用下的深度克隆
2011-08-04 20:39 2340深度复制和浅度复制 是当初初学 c 遇到的第一批问题,似乎使 ... -
模块的静态与动态循环依赖
2011-07-25 03:43 3297场景: 循环依赖 我是不支持的,但现实中似乎又确实需 ...
相关推荐
dwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwr
随着AJAX技术的发展,DWR2.0进行了许多改进和增强。这个版本引入了更强大的类型安全机制,提高了与Java对象的交互效率。DWR2.0支持更多的转换器和适配器,以便处理不同类型的服务器数据。此外,它还提供了更丰富的...
1、 导入dwr.jar包 2、 在web.xml中配置dwr,如下: <!-- 配置DWR --> <servlet-name>dwr-invoker org.directwebremoting.servlet.DwrServlet <init-param> <param-name>debug</param-name> ...
此版本的更新可能包括性能提升、新功能添加以及对旧版的兼容性改进。 2. **DWR的实例war文件**: 一个WAR(Web Application Archive)文件是Java Web应用的标准打包格式,可以直接部署在支持Servlet的Web服务器上...
该示例资源主要解决如下两个问题,其一就是解决SpringBoot集成DWR3.0.2-RELEASE版本,无配置文件快速简洁完成集成工作,省去dwr.xml等DWR框架初始化需要的配置文件;其二就是解决了集成后的SpringBoot项目在开发环境...
通过对比 DWR 3.0 和 DWR 2.0 的不同之处,我们可以看出 DWR 3.0 在多个方面进行了显著的改进和增强。无论是在架构设计、性能优化还是安全性增强等方面,DWR 3.0 都展现出了更强的能力。此外,它还提供了更为丰富的 ...
DWR2.0是DWR的一个版本,提供了一些增强特性和改进。 **DWR2.jar** 是DWR的主要库文件,包含了DWR框架的所有核心组件和实现。这个JAR文件包含了许多类,如`DWRServlet`,它是DWR与HTTP请求交互的核心组件,以及各种...
DWR(Direct Web Remoting)是一种Java库,它允许JavaScript在客户端与服务器端进行直接的交互,从而实现在Web应用程序中的Ajax功能。DWR的主要目标是简化前后端的数据交换,提高用户体验,使得Web应用能够像桌面...
**DWR(Direct Web Remoting)**是一种Java技术,它允许Web应用程序在客户端与服务器之间进行实时通信,而无需刷新整个页面。通过DWR,我们可以使用JavaScript直接调用服务器端的Java方法,实现Ajax(Asynchronous ...
DWR (Direct Web Remoting) 是一种开源Java技术,它允许Web应用程序在浏览器和服务器之间进行实时、双向通信,使得JavaScript可以直接调用服务器端的Java方法,极大地简化了客户端和服务器端的数据交换。本笔记将...
DWR 3.0引入了重大的改进和新特性,如增强的安全性、支持JSONP(JSON with Padding)以跨域通信、增加了对Spring框架的更深入集成、支持更多类型的Java对象转换为JavaScript以及改进的调试工具。这个版本的目标是...
DWR(Direct Web Remoting)是一种Java库,用于在Web应用程序中实现实时的JavaScript到服务器端Java对象的通信。这个技术允许开发者在浏览器中直接调用服务器端的方法,极大地简化了AJAX(Asynchronous JavaScript ...
DWR (Direct Web Remoting) 是一个开源的Java库,它允许JavaScript在浏览器端与服务器端的Java对象进行交互,实现动态的Web应用。DWR简化了AJAX(Asynchronous JavaScript and XML)的开发,使得开发者可以像调用...
DWR(Direct Web Remoting)是一种Java库,用于在Web应用程序中实现JavaScript和服务器端Java代码之间的双向通信。这个教程包含了一系列的文档和资源,帮助开发者深入理解和使用DWR。 首先,"DWR学习笔记"提供了对...
Direct Web Remoting (DWR) 是一个开源Java库,它允许Web应用程序在浏览器和服务器之间进行实时、安全的双向通信,有效地打破了JavaScript和Java之间的壁垒。这个技术在2005年推出,主要解决了AJAX(异步JavaScript...
DWR (Direct Web Remoting) 是一个开源Java库,它允许Web应用程序在浏览器和服务器之间进行实时通信,无需使用插件或复杂的JavaScript框架。DWR简化了AJAX(Asynchronous JavaScript and XML)开发,使开发者可以像...
DWR(Direct Web Remoting)是一个开源的Java库,它为Web应用程序提供了强大的Ajax功能。通过DWR,前端JavaScript可以直接调用后端Java方法,从而实现动态、实时的Web交互,提升用户体验。这个主题主要围绕DWR的两个...
Direct Web Remoting (DWR) 是一个开源的Java库,它允许在JavaScript和服务器端Java之间进行双向通信,实现Web应用程序的Ajax功能。DWR使得动态网页能够与后台服务器进行实时交互,无需刷新整个页面,提高了用户体验...
**标题:“DWR Jar包下载”** DWR (Direct Web Remoting) 是一个开源Java库,它允许在浏览器和服务器之间进行实时、双向通信。DWR使得JavaScript可以直接调用Java方法,就像是本地对象一样,极大地简化了Web应用...
DWR2是DWR的第二个主要版本,提供了许多改进和新特性,使得开发人员能够更轻松地构建动态、交互性强的Web应用。 在这个"DWR2相关资料"的压缩包中,我们可能找到了一个完整的DWR2演示项目,这个项目是为在MyEclipse...