prototype.js 和json.js 冲突
1.冲突简述和分析
prototype.js与json.js并不是完全兼容的。主要冲突在于json.js为Object的原型增加了一个toJSONString的方法。
冲突之一:是prototype中发送ajax请求时,遍历了一个header Object,结果将toJSONString也误当作一个header属性发送,导致错误:
[Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIXMLHttpRequest.setRequestHeader]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS frame :: http://astlogo.com/cstmface/js/lib/prototype.js :: anonymous ::
line 1289" data: no]
如果您没有将ajax请求异常捕获,遇到这个冲突的时候会很诡异。即没有js错误提示,也没有发送请求。如果遇到这样的情况,请在Ajax.Request请求的选项中多加一个事件监听:
function x_load_testdata(id) {
new Ajax.Request('testdata.php',
{
method:'get',
onSuccess: function(transport){
},
onFailure: function(){ alert('Request failure') },
onException: function(x, e) { alert(e) }
});
}
确认一下是否因为这个冲突导致。
冲突之二:反过来,如果将prototype使用的所有Object都增加一个toJSONString方法,也会出现问题。由于prototype的继承关系比较复杂,有些对象因此会继承多个toJSONString方法,调用的时候就会出错。
2.解决冲突的方案
首先,请先加载prototype.js,后加载json.js,这样就可以避免出现“冲突之二”。
<script type="text/javascript" src="js/lib/prototype.js"></script>
<script type="text/javascript" src="js/lib/json.js"></script>
其次,要解决prototype的Ajax.Request异常,就需要修改prototype.js的代码了(就我自己来说很不想改,不过如果您的项目也是必须同时依赖这两个JS,请也按照下面步骤修改):
在prototype.js中找到:(大概位于第1283行和1284行)
for (var name in headers)
this.transport.setRequestHeader(name, headers[name]);
修改为:
for (var name in headers) {
if (!Object.isFunction(headers[name])) {
this.transport.setRequestHeader(name, headers[name]);
}
}
就是用Object.isFunction方法确定遍历到的header的属性不是一个函数(过滤掉toJSONString这个属性),“冲突之一”也就解决了。
注:我使用的js版本:prototype.js 1.6.0.3 、 http://www.json.org/json.js (2007-03-06)
写到这里,其实prototype.js里面也有json to string的方法(Object.toJSON):
var data = {error:'', data:''};
var json = Object.toJSON(data);
alert(json);
如果不是必须使用这两个js,建议您只使用prototype.js
prototype.js 和json.js 冲突的更多相关文章
- 用json2.js 代替 json.js防止与jQuery的js冲突
用json2.js 代替 json.js防止与jQuery的js冲突 1 s.toJSONString json.js:259 2 Object.toJSONString json.js:158 3 ...
- js 使用json.js处理json对象
使用参考代码: <script src="json/json2.js"></script> <script type="text/javas ...
- js处理json js递归
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- JavaScript中解析JSON --- json.js 、 json2.js 以及 json3.js的使用区别
JSON官方(http://www.json.org/)提供了一个json.js,json.js是JSON官方提供的在JavaScript中解析JSON的js包,json.js.json2.js.js ...
- prototype.js 和 jQuery.js中 ajax 的使用
这次还是prototype.js 和 jQuery.js冲突的问题,前面说到过解决办法http://www.cnblogs.com/Joanna-Yan/p/4836252.html,以及上网说的大部 ...
- jQuery: jquery.json.js
http://api.jquery.com/jQuery.parseJSON/ http://www.json.org/json-zh.html http://fineui.codeplex.com/ ...
- TimeZone 时区 (JS .NET JSON MYSQL)
来源参考 : http://www.cnblogs.com/qiuyi21/archive/2008/03/04/1089456.html 来源参考 : http://walkingice.blogs ...
- 解决jQuery中美元符号($)命名与别的js脚本库引用冲突方法
在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg') 的写法.然而,当我们引入多个js库后,在另外一个js库 ...
- 在JavaScript中使用json.js:Ajax项目之POST请求(异步)
经常在百度搜索框输入一部分关键词后,弹出候选关键热词.现在我们就用Ajax技术来实现这一功能. 一.下载json.js文件 百度搜一下,最好到json官网下载,安全起见. 并与新建的两个文件部署如图 ...
随机推荐
- EBS应付(AP)模块常用表
select * from ap_invoices_all INVOICE头 select * from ap_invoice_distributions_all INVOICE行 select ...
- 5.1.3.jvm java虚拟机系统参数查看
不同的参数配置对系统的执行效果有较大的影响,因此,我们有必要了解系统实际的运行参数. 1.1.1.1. -XX:+PrintVMOptions 参数-XX:+PrintVMOptions可以在程序运行 ...
- iOS 10 推送全解析,注意事项
本文旨在对 iOS 推送进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacode 使用 iOS ...
- 高通msm8994手动提升性能脚本
点击打开链接 [plain] view plain copy stop thermald stop mpdecision stop thermal-engine # online A57 echo 1 ...
- 1.3、Android Studio创建一个Android Library
一个Android Library结构上与Android app模块相同.它可以包含构建一个app需要的所有东西,包括圆满,资源文件和AndroidManifest.xml.然而,并非编译成运行在设备 ...
- UNIX网络编程——客户/服务器程序设计示范(四)
TCP预先派生子进程服务器程序,accept使用线程上锁保护 我们使用线程上锁保护accept,因为这种方法不仅适用于同一进程内各线程之间的上锁,而且适用于不同进程之间的上锁. ...
- UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认
在socket系统调用中,如何完成三次握手和四次挥手: SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,close也不 ...
- Fragment详解-android学习之旅(四十八)
Fragment的设计哲学 Fragment的继承体系 Fragment的开发 大部分都会继承如下的三个方法 Fragment与Activity的通信 Fragment与Activity交互信息 Fr ...
- Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite
Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...
- Java 8新特性探究(一) JEP126特性lambda表达式和默认方法
Lambda语法 函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是只包含一个方法的接口.比如Java标准库中的java.la ...