jQuery 有 ajax 的支持,我应用的情况是:需要在ajax请求的对象中附加自己的数据
本来jQuery ajax 方法中要传递的对象都是事先规划好的,每一个参数都有jQuery的操作意义,如果在应用中需要附加自己的参数,当然要命名新的KEY,比如:伪代码
jQuery.ajax({MyData:mydata,其他jqueryajax参数})
这里的MyData参数就是自己应用中需要传递的参数对象,且不讨论要传送什么,这个需求有可能有的。
问题:
如果这个MyData的对象是一个复杂的含有循环引用的对象的话,有可能造成与jQuery ajax 方法内部实现的冲突。
因为在jQuery ajax 内部实现中对ajax的参数对象进行了深度的扩展,我们知道javascript的深度扩展实现中要避免循环引用的状况,这种情况会造成死递归循环发生,这一点看jQuery的ajax实现代码就可以知道问题所在:
ajax: function( s ) {
// Extend the settings, but re-extend 's' so that it can be
// checked again later (in the test suite, specifically)
var MyData=s.MyData;//改造后的代码
if(MyData) delete s.MyData;//改造后的代码
s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
if(MyData) s.MyData=MyData;//改造后的代码
//........省略
}
可见如果是循环引用的参数附加到ajax方法中必定造成extend的死循环。通过改造后,可以避免这一状况的发生。
开源就是有这点优势。
备注:
这完全是笔者省事的做法,如有其它更标准的方法请明示
本文探讨了在使用jQuery的AJAX方法时如何安全地附加自定义数据,特别是当这些数据包含循环引用时如何避免死循环的问题。介绍了jQuery内部实现原理,并提出了一种解决方案。
1万+

被折叠的 条评论
为什么被折叠?



