Ajax-pushlet-client是pushlet的ajax客户端方式,对该JS进行分析后发现,它是采用了面向对象的javascript技术和充分利用XMLHttpRequest对象来实现的HTTP长连接,达到了服务器“推”技术。

1、属性
NV_P_FORMAT: ‘p_format=xml-strict’,//数据格式,默认是严格严格XML
NV_P_MODE: ‘p_mode=pull’,//pushlet采用的模式,默认为pull模式
pushletURL: null,//请求URL地址
webroot: null,//项目根路径
sessionId: null,//sessionId
STATE_ERROR: -2,//一些状态常量
STATE_ABORT: -1,
STATE_NULL: 1,
STATE_READY: 2,
STATE_JOINED: 3,
STATE_LISTENING: 3,
state: 1,//状态

statusMsg: ‘null’,//状态消息
statusChanged: false,//状态是否发生了改变
statusChar: ‘|’,//状态分隔符

2、方法
_init:获取XMLHttpRequest对象
设定pushlet的请求URL
将状态置为STATE_READY.

_doRequest (anEvent,aQuery):首先判断是不是出现错误,然后再判断是否需要等待状态,若不需要等待则构建查询字符串。最后调用_getXML(url,PL._onResponse)方法向服务器发出请求,后一个参数为回调方法。

_getWebroot:获取项目根目录,可以根据实际项目修改

_getXML:以get方式请求URL,用同步或者异步方式

_onResponse(xml):先将xml转变为pushlet事件对象(_rsp2Events),得到多个PushletEvent对象,再调用_onEvent()处理每个事件。

_rsp2Events(xml):取得事件标签(event),然后调用PushletEvent(),可能得到多个PushletEvent对象。

_onEvent(event):处理由服务器端传来的事件,首先判断事件类型,由不同的类型调用不同的处理方法:
Data:调用_doCallback(event,window.onData),方法处理。onData是自定义;
Refresh:从event中取得刷新时间,然后调用_doRequest(‘refresh’)刷新;
Error:将state置为STATE_ERROR,获取错误原因,调用_doCallback(event,window.onError);
join-ack:将状态置为” STATE_JOINED”,取得sessionId,调用_doCallback(event,window.onJoinAck);
join-listen-ack:将state设为STATE_LISTENING,取得sessionId,调用_doCallback(event,window.onJoinListenAck);
listen-ack、hb、hb-ack、leave-ack、refresh-ack、subscribe-ack、unsubscribe-ack、abort、/nack$/等类型也类似。

_addEvent(elm,evType,callback,useCapture):取得elm对象,调用以下三者之一:
obj.addEventListener(evType,useCapture);
obj.attachEvent(‘on’ + evType,callback);
obj[‘on’ + evType] = callback。
当ajax-pushlet-client.js初始化时调用了该方法:PL._addEvent(window,‘load’,PL._init,false);即初始化时相当于:window.onload=PL._init();

_doCallback(event,cbFunction):如果指定了回调方法,则调用cbFunction(event),如果没有指定那么调用window.onEvent(event)。

_getobject(obj):获取对象引用,若参数为对象直接返回该对象引用,若为字符串则按ID取得该对象。

PushletEvent(XML):与nl.justobjects.pushlet.Event相对应。其内部方法或属性如下:
Arr:数组,用于存放链值对;
getSubject():取得p_subject标签值;
getEvent():取得p_event标签值;
put(name,value);将链值对放入arr中;
get(name):按链取得值;
toString:转换为链值对字符串;
toTable:转换为表格;

将传入xml解析到arr中。

其对外公开方法: heartbeat():实质是调用了PL._doRequest(‘hb’),向后台请求“hb”事件。再被封装成了:p_heartbeat()精简方式。 相似的方法还有: Join:_doRequest(‘join’,PL.NV_P_FORMAT + ‘&’ + PL.NV_P_MODE); joinListen:PL._doRequest(‘join-listen’,query);请求加入同时监听; leave:_doRequest(‘leave’); listen(aSubject):_doRequest(‘listen’,query);按主题监听; publish(aSubject,theQueryArgs):_doRequest(‘publish’,query);按主题发布; subscribe(aSubject,aLabel):_doRequest(‘subscribe’,query);按主题订阅; unsubscribe(aSubscriptionId):_doRequest(‘unsubscribe’,query);按订阅ID退订;

Pushlet的Ajax-pushlet-client.js分析的更多相关文章

  1. 详解使用postMessage解决iframe跨域通信问题

    这篇文章主要介绍了详解使用postMessage解决iframe跨域通信问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码

    这篇文章主要介绍了HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. 浅谈html5之sse服务器发送事件EventSource介绍

    本篇文章主要介绍了浅谈html5之sse服务器发送事件EventSource介绍,具有一定的参考价值,有兴趣的可以了解一下

  5. HTML5 拖放(Drag 和 Drop)详解与实例代码

    本篇文章主要介绍了HTML5 拖放(Drag 和 Drop)详解与实例代码,具有一定的参考价值,有兴趣的可以了解一下

  6. ios – Swift中的非响应流委托

    所以我在Swift中使用套接字并试图将应用程序与我的服务器连接起来.我让应用程序连接到服务器的IP地址,并在服务器上使用netcat进行测试.在执行期间,应用程序的控制台输出显示它已成功连接到服务器.但是,流委托似乎没有响应.当我输入netcat时,app控制台没有打印任何内容.我已经搜索了很长一段时间,发现我的实现与其他实现非常相似.也许我在这里遗漏了一些我看不到的东西.任何想到这个问题的人都将不胜感激!

  7. ios – UIScrollView内容不允许用户交互

    我有一个启用了分页的UIScrollView,如下所示:在UIScrollView中,我添加了几个UIWebViews,并将其启用的交互设置为是这样的.它打破了UIScrollView上的分页和所有触摸.如果我将用户交互设置为NO,则页面有效,但我无法在UIWebView中突出显示文本.我试着像下面那样对UIScrollView进行子类化,但是会出现同样的情况.任何的想法?

  8. ios – 如何知道用户在iPhone中的播放控件上单击快进和快退按钮

    还是有其他方法吗?

  9. ios – 如何在使用隐式动画为CALayer设置动画时继承动画属性

    我试图使用隐式动画在CALayer上设置自定义属性的动画:在-actionForKey:方法我需要返回动画,负责插值.当然,我必须以某种方式告诉动画如何检索动画的其他参数.有关如何实现这一点的任何想法?

  10. ios – touchesMoved在iPhone 6s及以后的单点击中被调用

    解决方法可能是更高分辨率的屏幕对任何移动都更敏感.当你敲击时,你实际上可能正在滚动你的手指,使它看起来像一个小动作.两种可能的解决方>在touchesMoved:方法中检查触摸移动了多远.如果这是一个非常小的举动,请忽略它以进行_isTapped检查.>而不是覆盖触摸…

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到<input>中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部