else if (eventType == 'listen-ack') { _setStatus('listening'); _doCallback(event, window.onListenAck); // Send empty heartbeat event. This // silences many busy browser windows. // At least in Moz and IE. alert("在push方式下服务端持续发数据,正常情况下后面的语句继续执行"); p_heartbeat(); }
查看pushlet服务端发送侦听确认后,客户端收到一段内容后(服务端持续发送)是否立刻执行,答案见下:
[JavaScript脚本中的alert的问题]的几个有争议的地方有:
1:html是否在完全被传送到客户段之后才显示?
2:JavaScript是否在html完全显示后执行?
3:如果JavaScript在html没有被完全显示就可以执行,那么此时的alert会不会是浏览器本身与服务器端的通信处于等待状态?( [JavaScript脚本中的alert的问题]alert状态下,浏览器会处于等待状态是指浏览器自身当前的线程处于等待状体)
首先我们先假设html是在完全被传送到客户段之后才显示。那么我们在打开网页的时候也就会有这种现象出现:如果打开很大的网页(指数据比较多,图片很大)时候,刚刚打开的时候会是一片空白,过了一段时间之后画面会突然出现。空白的时候是浏览器在与服务器请求数据,由于数据很大,请求的时间就会相应长。那么在这段时间内由于html数据没有传送完成,浏览器不会显示html的信息,所以会一片空白。
对此我做了一个测试试样:
























我通过直接将一大文件往网页内写。文件是一张比较大的图片:有2M多,通过50次的循环读写,那么发送到客户段的数据超过100M,这样浏览器的处理起来的时候就会比较慢。从测试的结果是浏览器逐步的显示出接收到的内容。与期望的一次性显示并不相同。
对于这个显现的原因是:浏览器在接收到的数据中,每当接受到一个完整的Table内容后就会显示,并不是将所有的数据都接收完成后一次性的显示出来。这种显现可能大伙在访问图片比较多的网站的时候可能会常常遇到,打开一个网页等了半天还是只显示了一部分。
这就说明了1:html是不是在完全被传送到客户段之后显示。
对于第二个问题我假设JavaScript脚本是在Html显示完全后才能被执行,对于设计的测试方法我只是简单的在循环操作开始前添加如下面依据话:
this.Page.Response.Write("<SCRIPT >alert(\"ee\");</SCRIPT>");
假如JavaScript脚本是在Html显示完全后才能被执行,那么在所有的信息显示完全之前不会弹出alert对话框。但是测试的结果是在页面内容显示之前就执行了脚本。
接下来网页会继续往下显示。
对于这个现象的原应是:浏览器在接受到部分相对完整的数据(比如说一个Table)就显示。在显示过程中如果遇到脚本就会执行。
这就说明了2:JavaScript脚本在是在Html显示过程中可以被执行。
由于有了1和2的不成立,才可以推断3。如果1和2都成立的话,那么由于脚本是在Html被发送完成之后再执行,那么此时浏览器已经与服务器断开的通信(由于HTTP协议的特点,在服务器将浏览器请求的数据发送完成之后,即断开与客户机的连接操作)那么此时执行alert即时使浏览器当前线程处于等待状态,也不会对服务器造成任何影响)
由于1和2的测试结果使3的答案无法定论。所以假设会给服务器造成压力,而造成压力的理由是:由于alert使浏览器处于等待状态,这个时候可能与服务器的通信还没有终止,所以会使客户端与服务器长时间连接在一起,从而造成压力。如果上叙理由成立,那么此时监视服务器就会发现IIS当前会一直处于激活状态。
通过软件测试,首先把IIS中的站点属性设置中将[启用HTTP激活]去掉。然后通过软件简单的监视IIS的连接数。
测试的结果是在alert没有被关闭之前,IIS并没有保持激活状态,这也就说明IIS并没有与客户端一直保持通信协议。
对于这个现象的原应是:由于通信协议的特点决定的,由于网络通信协议中是自底向上服务的特点,HTTP协议也是通过网络中的TCP/IP协议进行通信。由于通信协议的服务特点,所以即使是浏览器处于正待状态,这并不影响底层的TCP通信。因为TCP自下向上服务,对于上层调用不去过多的理会下层的操作状态。
好了这个问题也就解释清楚了,希望能够对大伙有所帮助。