prototype.js 和json.js 冲突

2023-11-18

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

prototype.js 和json.js 冲突 的相关文章

随机推荐

  • conda创建虚拟环境 python版本不对_如何在conda虚拟环境中指定python版本

    我在新的职位上负责一个工作项目 我相信虚拟环境是在它里面创造的 正如我所见 head bm3 py usr bin env opt bm3 venv bin python3 bm3 venv是使用requirements txt 使用vir
  • 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(二)之分库分表路由

    关注微信公众号 芋道源码 有福利 1 RocketMQ MyCAT Sharding JDBC 所有源码分析文章列表 2 RocketMQ MyCAT Sharding JDBC 中文注释源码 GitHub 地址 3 您对于源码的疑问每条留
  • c++学习之pair对组创建

    功能描述 成对出现的数据 利用队组可以反回两个数据 函数原型 pair
  • C# 项目没有.sln文件的解决办法:

    什么是sln文件 sln文件开发中使用的解决方案文件 使用解决方案文件 后缀为sln的文件 表示一个项目组 他通常包含一个项目中所有的工程文件信息 包括文件版本 工程信息 全局设置 通过打开sln文件就可以加载整个项目 但是我新建的一个项目
  • Win11总是出现BitLocker恢复,想要彻底关闭它该如何操作?

    win11解除bitlocker加密方法一 1 首先按下键盘 Win R 打开运行 如图所示 2 打开运行后 在其中输入 control 并点击 确定 打开控制面板 如图所示 3 打开后 进入 bitlocker驱动器加密 如图所示 4 随
  • 【计算机视觉

    文章目录 一 ResNeSt 二 ShuffleNet v2 三 FBNet 四 Inception v4 五 ResNet D 六 MetaFormer 七 PyramidNet 八 RevNet 九 Convolutional Visi
  • Shell脚本运行中的停止方法

    Linux系统Shell中提交了一个脚本 但是需要停止这个进程 如何处理 方式1 killall file flume kafka 说明 killall是一个命令 不是kill all file flume kafka是脚本名 此方法简单粗
  • C++ 发送http太慢导致数据积压问题分析(Linux)

    问题现象 程序接收数据 对数据进行简单地处理 处理完之后发送到其他平台 程序在接收到数据到在其他平台上面显示时间差了将近一个小时 存放要发送到其他平台的数据的容器积压了大概一百五十多万条的数据 问题排查过程 1 接收数据与发送数据到其他平台
  • 列出所有共享的文件夹权限或 NTFS 权限 (PowerShell)

    列出所有共享的文件夹权限或 NTFS 权限 PowerShell 此 PowerShell 脚本说明如何列出所有共享的文件夹权限或 NTFS 权限 下载 ListAllSharedFolderPermission zip 出所有共享的文件夹
  • HTML5网页设计常用标记-链接标记和列表标记

    链接标记 在HTML语言中 利用 a 标记在网页中创建超链接 语法格式 a href 跳转目标 target self 文本或图像 a 文字设置为超链接后 默认显示为加下划线的蓝色字体 图片设置为超链接后 会自动加一个黑色的边框 a 标记常
  • 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结

    程序占用的内存分为几个部分 各个部分起什么作用 字符数组 字符指针在实现上有什么区别等等 本文对此做了详细阐述 特转载于此 供大家学习参考之用 一个由C C 编译的程序占用的内存分为以下几个部分 1 栈区 stack 由编译器自动分配释放
  • 数据驱动性能体验优化

    本专题共10篇内容 包含淘宝APP基础链路过去一年在用户体验数据科学领域 包括商详 物流 性能 消息 客服 旅程等 一些探索和实践经验 在商详页基于用户动线和VOC挖掘用户决策因子带来浏览体验提升 在物流侧洞察用户求助时间与实际物流停滞时长
  • Ceph Pool操作总结

    Ceph Pool操作总结 一个ceph集群可以有多个pool 每个pool是逻辑上的隔离单位 不同的pool可以有完全不一样的数据处理方式 比如Replica Size 副本数 Placement Groups CRUSH Rules 快
  • bazel的使用

    bazel的使用 bazel是google开源的构建工具 可以支持多种语言的构建 这里来尝试一下如何在C 项目中使用bazel构建 安装就不介绍了 在官网很详细 输入bazel help Usage bazel
  • AD中如何对圆形PCB板进行铺铜

    因为之前做了一块圆形的PCB板子 所以在铺铜时候发现圆形铺铜我该怎么快速去铺 于是查了一下网上 大部分人是推荐先圈出一个圆弧 然后在通过快捷键TVG或者是按下 shift 空格 但是我发现不适合我 于是我分享一下自己的方法 我们如果要对圆形
  • 调参小技巧-DBSCAN参数选取方法

    利用循环迭代一些参数变量选取最适合的参数 1 初始数据处理部分 请自行对照调整 此处仅作为保持流程完整使用 读入第三方包 from sklearn import preprocessing 选取建模的变量 predictors Birth
  • 不得不引起足够重视的anonymous用户!

    连日的阴雨 使原本炎热的天气突然变得潮湿起来 烦躁的心情也慢慢地平复了下来 像往常一下 借用CuteFtp工具登录自己的VPS 检查一下文件异常 突然之间 几个刺眼的 exe文件呈现在我的眼前 顿时惊出我一身冷汗 下意识到 网站被黑客入侵了
  • C#使用Npgsql或SqlClient连接数据库

    目录 SqlClient连接SQL Server 安装SqlClient SqlConnection SqlCommand SqlConnection 和 SqlCommand的区别 Npgsql连接PostgreSQL 安装Npgsql
  • Asp.net core

    Startup类 以配置应用所需的服务 应用的请求处理管道定义为一系列中间件组件 public class Startup public void ConfigureServices IServiceCollection services
  • prototype.js 和json.js 冲突

    1 冲突简述和分析 prototype js与json js并不是完全兼容的 主要冲突在于json js为Object的原型增加了一个toJSONString的方法 冲突之一 是prototype中发送ajax请求时 遍历了一个header