解决responseXML为空的问题及TIMER的使用

阅读更多
    在使用AJAX请求的过程中,大家也许接触多种数据解析,今天算又挑战了一下自己,服务端使用XML封装数据。

    相对比纯String,XML的格式可以清晰表达多更多的关系。而相对于JSON,XML字体会复杂和臃肿多了,但JSON的使用要求相对比较高些,而操作XML的话还更为简单(用JavaScript DOM的话就没问题了)。

    使用建议,视情况而定,选择自己觉得适合的数据格式。

    关于String
    数据量少的话,当然Stirng最快捷简单了,虽然也许需要分割成那烦人的数组,但对比起要封装XML和JSON数据要简单的多。虽然目前XML和JSON的工具类也不少了,但便捷上还是有一定差距的。

    关于JSON
    个人比较喜欢的数据类型,把它看成一个数据就可以了。而随着JavaScript的framework的强大,解析成JSON对象越来越简单了,并且安全性也帮我们验证完毕了,强大的framework们。使用JSON,你将非常简单的把服务端的BEAN转移到JavaScript之上。但目前还是要看使用场合的,渐渐的多人用起来吧。

    关于XML
    老前辈了,无论JSON怎么流行,XML也不会退出历史舞台的,这点可以肯定的说。也不用我多阐述了。并且它除了比较臃肿和转成JavaScript的BEAN对象(OO中毒的关系)比较麻烦的之外,没什么令人讨厌的地方。还有相对于JSON来说,易读性还觉得优势。

    当然封装JSON和XML信息体之前必须注意严谨的格式和非法字符的处理。

    言归正传。

    想使用responseXML获取XML document对象的话必须注意以下几点。

    1、 服务端返回的XML格式要确保有效,多使用print等调试吧。

    2、 确保respnse的信息体(ContentType)内容为"text/xml"

    很多人都不知道有这点,所以造成的后果是获取到的的数据则仅仅是一个XML格式的String,而不是一个XML文档对象。当然也可以把String再解析加载成XML,但就麻烦多了,并且String转成XML对象的方法也存在浏览器兼容性问题。

    3、 如果以上两点确定没问题的情况下,先尝试用responseText调试。看看内容是否如你所愿。

    如果以上都确保无误的,但使用request.responseXML的时候,能获取到object对象,但查找不了任何节点的话(childNodes为0),可以断定95%是解析XML的问题了。

    查看response消息体的方法也可以使用以下方法

   
alert(request.getAllResponseHeaders()); 


    使用浏览器进行对返回的XML数据调试

    使用IE和firefox直接打开XML字符串查看调试结果。推荐FireFox,因为更加严谨一些,IE的话很多时候都产生错觉,因为容错比较厉害,看IE解析HTML代码就知道了。

    一般的,使用firefox打开后能正常显示内容的话不会有问题的了。

    小心使用

    在通常情况下,我们也许为了规范而在编写XML内容时,在内容顶端上声明类似

的字符串以让识别为XML格式,并且指定解析编码格式。(这里说类似是因为不一定所有人都使用utf-8编码)

    其实大家也有发现,就算这样声明了,对编码不会有任何的帮助,但IE打开的时候还是可以直接的把内容识别为XML,不然会以默认的格式。

但今天我遇到的问题就因为因为声明了这个报头所引起的,是firefox查看XML内容时,firefox老大指出的。使用IE能正常访问,并且responseText也正常。然后我把那一串报头去掉。一切正常了。

    所以我推荐在使用responseXML接收数据的时候,服务端不必把XML的那一串报头写上。其实只要在response上指定了ContentType为text/xml的话,浏览器已经知道你这个消息体是xml的了。会以XML的方式解析,我测试过IE和firefox均正常无误,并且编码也是这里指定的话才生效的。

    另外两点建议:

    1、解析有问题的话,request.responseXML还是能返回对象的,但这个对象未必正常(指包含所有XML节点)。

    2、使用request.responseXML.documentElement获取XML对象。
参考第一点,如果发生1的情况的话使用request.responseXML.documentElement的话是得不到任何对象的。但相反,若获取到对象的话,你就可以放心去使用DOM解析你的XML document了。

    关于JavaScript TIMER的使用

    也许有的人觉得不解,何谓“JavaScript TIMER”,自己的称呼而已,也许有点通俗。就是JavaScript的任务回调器、定时器。

    使用场合的话,最好的一个例子就是将你open一个新的窗口时候,想要在新窗口内进行DOM操作时,你会觉得使用JavaScript timer很好的帮手,不然就会莫名的去找为什么得不到节点,明明节点是有的,ID也是对的...甚至....

    使用timer很简单,一共有两种方法。

    1、单次调用。
   
var id = window.setTimeout(fx, delay);


    把一个timer绑定到指定window之上,在delay之后调用fx方法。

    2、重复调用。(使用场合相对比较多)
   
var id = window.setInterval(fx, delay); 


    参照第一个,只是调用完之后继续回调。

    两者返回的id是很有作用的,用来停止timer继续运行。特别对于第二种方式,如果不停止的话后果可想言之。

    tip:delay单位为毫秒, fx为回调的方法。
   
    停止timer的方法

   
window.clearTimeout(id);

    与
   
window.clearInterval(id);


    关于如何判断新窗口文档已经加载完毕

    使用document.readyState属性,即
if (document.readyState == 'complete') {
  window.clearInterval(id);
  //something to do
}


注意:
引用
readyState属性目前只有IE支持
如果想兼容性好的话推荐还是在用onload等类似的事件解决

你可能感兴趣的:(json,XML,IE,JavaScript,Firefox)