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

转载于:https://www.cnblogs.com/wuyida/p/6300400.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript的Date对象是用来操作日期和时间的对象,它包含了很多有用的方法和属性。其中,Date.prototype.format()方法是一个常用的方法,用于格式化日期为特定格式。 Date.prototype.format()的语法如下: ```javascript Date.prototype.format(format) ``` 其中,format是一个字符串,用于指定输出日期的格式。可以使用以下格式占位符: - "yyyy" 代表年份,例如:"2021" - "MM" 代表月份,例如:"01" 表示一月份 - "dd" 代表日期,例如:"01" 表示第一天 - "HH" 代表小时,24小时制,例如:"12" 表示12小时 - "mm" 代表分钟,例如:"30" 表示30分钟 - "ss" 代表秒钟,例如:"00" 表示0秒钟 以下是一个使用Date.prototype.format()方法的示例: ```javascript let date = new Date(); let formattedDate = date.format("yyyy-MM-dd HH:mm:ss"); console.log(formattedDate); ``` 输出结果将会是类似"2021-07-01 12:30:00"这样的格式化日期字符串。 除了以上示例中的格式以外,还可以根据需要自行组合占位符来定义输出的日期格式。例如,可以使用"yyyy年MM月dd日 HH时mm分ss秒"来定义输出格式为"2021年07月01日 12时30分00秒"。 需要注意的是,Date.prototype.format()方法是自定义的方法,不是原生的JavaScript方法,所以在使用之前需要先定义该方法。 总而言之,使用Date.prototype.format()方法可以方便地格式化日期为指定的格式,提高日期处理的灵活性和可读性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值