浏览 3893 次
锁定老帖子 主题:关于用XHR实现浏览器端pause()功能
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-29
看了很多资料,基本得到的结论是除了sjax,无法完整实现pause功能。 但是如果直接用应用服务器来处理这个同步XHR请求,随着pause时间越长,后台的http线程池会被消耗光。 我想了个方案(前提是servlet 3.0出来前),通过内嵌jetty,在特定的端口专门提供这种pause服务,这样就不会占用应用服务器的http线程了。 不知道可行不?大家提提建议 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-01-31
呵呵,见过不怕死的,没见过自己伸出脖子送死的。
xhr pause会让浏览器假死,而且因为JS语法的一些历史原因,这个状态短期内不要指望有很大的变化。 |
|
返回顶楼 | |
发表时间:2009-01-31
jindw 写道 呵呵,见过不怕死的,没见过自己伸出脖子送死的。 xhr pause会让浏览器假死,而且因为JS语法的一些历史原因,这个状态短期内不要指望有很大的变化。 ls说的很有道理。 不过lz的想法很有创意,这样倒是可以解决一些问题,但是带来的新问题更大。 |
|
返回顶楼 | |
发表时间:2009-02-01
jindw 写道 呵呵,见过不怕死的,没见过自己伸出脖子送死的。
xhr pause会让浏览器假死,而且因为JS语法的一些历史原因,这个状态短期内不要指望有很大的变化。 假死不要紧吧(其实是因为richfaces是异步调用,我想用它来做校验,等服务器校验结果返回后再决定是否提交表单,所以想用pause来延迟一段时间,直到服务器结果返回),而且同步XHR不是可以设置超时吗? |
|
返回顶楼 | |
发表时间:2009-02-01
假死问题很严重。随便找个用户问问看。
|
|
返回顶楼 | |
发表时间:2009-02-04
pause没有好的方法。
用隐藏的模态对话框是一个方式,但是IE-only,而且现在模态对话框已经无法隐藏了。 用同步xhr只是能实现效果,但是如jindw所说,显然也不是好方法。 一般而言,如果有了yield,编程上就不需要pause了。如果你有什么场景觉得需要pause,可以拿出来大家探讨探讨。 最后,月影在51js上写过一篇文章描述如何通过源代码操作来实现pause(实际上就是代码生成),这个方式理论上可以延伸到实现yield(其实类似于把另一种语言转换或说编译为js啦),但是没有见到进一步深入下去。 |
|
返回顶楼 | |
发表时间:2009-02-04
最后修改:2009-02-04
hax 写道 pause没有好的方法。
用隐藏的模态对话框是一个方式,但是IE-only,而且现在模态对话框已经无法隐藏了。 用同步xhr只是能实现效果,但是如jindw所说,显然也不是好方法。 一般而言,如果有了yield,编程上就不需要pause了。如果你有什么场景觉得需要pause,可以拿出来大家探讨探讨。 最后,月影在51js上写过一篇文章描述如何通过源代码操作来实现pause(实际上就是代码生成),这个方式理论上可以延伸到实现yield(其实类似于把另一种语言转换或说编译为js啦),但是没有见到进一步深入下去。 场景是这样的: 我的项目里面使用了richfaces,以异步请求方式对表单内容进行后台校验并返回校验结果,这个是在表单提交按钮点击后做的(按钮的onclick事件,受JSF的限制,很难通过javascript去控制表单以JSF的标准提交)。 这样就有个问题,如果校验是异步进行的,没等校验结果返回,onclick事件就成功执行,然后表单就提交了,达不到校验的效果(根据校验结果决定是否提交表单)。 所以,需要有个办法阻止代码在发出异步请求后继续往下走,直到异步请求返回,我实现了一个pause()函数,功能类似Thread.sleep(),是通过模态窗口实现的,但是模态窗口实现有缺陷(大家都知道了,这里不做说明了)。 我尝试了一下XHR的做法,由于每次pause只100毫秒,而且等待异步请求返回时间不长,再加上timeout设置,客户端基本感觉不到假死现象。 附上代码,里面没有timeout设置 前台 var starttime = new Date().getTime(); var now = null; var gap = 10000; //超过10秒认为网络不通 while(null == isValidatePass){ //isValidatePass由校验的异步请求返回后的回调函数中设置 now = new Date().getTime(); if(now - starttime >= gap){ alert('超时,请稍后再试'); //throw "超时 " + gap; break; }else{ pause(100); } } pause函数 function pause(numberMillis) { //var dialogScript = 'window.setTimeout(' + ' function () { window.close(); }, ' + numberMillis + ');'; // For IE5. //var result = window.showModalDialog('javascript:document.writeln(' + '"<script>' + dialogScript + '<' + '/script>")'); var url = "/test.jsp?delay=" + numberMillis + "&" + Math.random(); //alert(url); xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP"); //调用远程服务器,method参数为“get”,使用同步方式 xmlHttpRequest.open("GET", url, false); xmlHttpRequest.send(null); } |
|
返回顶楼 | |
发表时间:2009-02-04
JSF自己有校验机制,为什么不用呢?
如果要自己的校验,则可以直接使用同步校验啊。或者直接在返回页面中产生校验失败的信息(就如同传统的表单页面)——毕竟即使使用ajax,服务器总是要校验数据的。 月影的文章地址是:http://bbs.51js.com/viewthread.php?tid=66361 但是注意,此文只适用于有志于探索JS的同志,不建议在实际应用中采用。 |
|
返回顶楼 | |
发表时间:2009-02-04
最后修改:2009-02-04
hax 写道 JSF自己有校验机制,为什么不用呢?
如果要自己的校验,则可以直接使用同步校验啊。或者直接在返回页面中产生校验失败的信息(就如同传统的表单页面)——毕竟即使使用ajax,服务器总是要校验数据的。 月影的文章地址是:http://bbs.51js.com/viewthread.php?tid=66361 但是注意,此文只适用于有志于探索JS的同志,不建议在实际应用中采用。 ajax可以增强用户体验。 又不想修改richfaces。 月影用的是闭包原理,并不能阻止form submit事件往外传递,恢复时也不能使form继续提交,不能满足我的要求 |
|
返回顶楼 | |