不使用本机 XMLHttpRequest 的原因 - 为啥 $.ajax 是强制性的?

Posted

技术标签:

【中文标题】不使用本机 XMLHttpRequest 的原因 - 为啥 $.ajax 是强制性的?【英文标题】:Reasons not to use native XMLHttpRequest - why is $.ajax mandatory?不使用本机 XMLHttpRequest 的原因 - 为什么 $.ajax 是强制性的? 【发布时间】:2012-11-01 17:48:10 【问题描述】:

我正在编写一个应用程序:

    绝对依赖通过javascript向服务器发送数据 代码中不得包含JQuery 库。

(不知道我的代码会不会被包含在已经有jquery lib的网页中,不知道有没有合适的版本,不知道会不会有JQuery冲突等等... )

我必须使用本机 JS 功能 XMLHttpRequest(ActiveX for older IE's) 方法,这很简单,但比我看到的警告:

“没有 jQuery,AJAX 编码可能有点棘手!

编写常规的 AJAX 代码可能有点棘手,因为不同的 浏览器对 AJAX 实现有不同的语法。这意味着 你将不得不编写额外的代码来测试不同的浏览器。 但是,jQuery 团队已经为我们解决了这个问题,因此我们可以 只需一行代码即可编写 AJAX 功能。”

这有什么“棘手”?我可能做错了什么?据我所知

var xmlhttp;
if (window.XMLHttpRequest)
  // code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp = new XMLHttpRequest();
  
else
  // code for IE6, IE5
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  

只是针对不同浏览器的额外代码,我的 xmlhttp var 从现在开始应该可以在 IE5IE6IE7+FirefoxChromeOpera、@ 中完成这项工作987654334@.

在使用原生 XMLHttpRequest 对象时,我应该做以上跨浏览器代码调整吗?还是有什么需要注意的?

【问题讨论】:

如果你认为跨浏览器的 JavaScript 编码简单而轻松,这一定是你的第一个任务:) 完全同意阿尔瓦罗。此外,您可以浏览 jQuery 源代码以查看它的确切作用。例如,请参阅here - 您当前的代码无法解决许多问题。在基本测试期间它们都不会出现。 不,Alvaro,问题是除了演示几行代码外,我没有看到任何痛苦,这是我可以忍受的。麻烦的是,我无法相信这一切都是痛苦,而且再也没有…… 如果您认为跨浏览器编码并不太复杂,那么这要么是您的第一个项目,要么您是一位非常有经验的 javascript 编码器。 也许我写错了...我遇到了麻烦,因为 我不能使用 Jquery,我正在尝试在这里找到解决方案,我想知道到底是什么棘手的部分 【参考方案1】:

XMLHttpRequest 对象在这里被定义为 W3C 标准:

http://www.w3.org/TR/XMLHttpRequest2/

因此 API 本身应该在浏览器之间保持一致。

正如您所提到的,唯一的变化应该是如何获取 XMLHttpRequest 对象。见这里:

http://www.quirksmode.org/js/xmlhttp.html

对于跨浏览器、非 jQuery 的处理方式(获取对象在他的 XMLHttpFactories 数组中完成。

【讨论】:

AFAIK 没有浏览器可以完全正确地实现该标准,因此整个功能集的行为将是一致的。【参考方案2】:

这是跨浏览器支持的唯一必要条件,除非您需要支持非常旧的 IE(显然使用不同的 ActiveXObject)。

但是,使用例如jQuery 提供了许多额外的优势:

单个函数调用,没有不必要的变量使您的范围变得混乱。 将对象自动序列化为 GET/POST 参数。当您可以简单地传递一个对象时,为什么要手动执行(您需要正确编码值!)? 自动解析响应,例如如果是 JSON,您会得到一个对象,而不仅仅是需要手动解析的字符串。 常见事件(成功/失败/完成)的良好回调 可插拔架构以支持例如IE 中 CORS 的 XDomainRequest。

既然你提到你不能使用 jQuery,因为你的应用程序将被嵌入到另一个可能与之冲突的站点中:你可以通过包含 jQuery 来避免这种情况,然后使用 $.noConflict(true) 来恢复旧的 $ 和 @987654323 @变量。要在你的代码中使用它,你可以这样写:

(function($) 

)(jQuery.noConflict(true));

【讨论】:

你好吗,约翰·雷西格?

以上是关于不使用本机 XMLHttpRequest 的原因 - 为啥 $.ajax 是强制性的?的主要内容,如果未能解决你的问题,请参考以下文章

无法建立与 Firebase 版本不兼容的原因,并且相机反应本机

Bazel + Angular + SocketIO 原因:未捕获的 TypeError:XMLHttpRequest 不是构造函数

使用 XMLHttpRequest 将多个文件上传到 Express.js 3.5 服务器

Chrome 拓展开发 Service Worker 无法使用 XMLHttpRequest 发送 HTTP 请求

Bazel + Angular + SocketIO V3 原因:Uncaught TypeError: XMLHttpRequest is not a constructor

XMLHttpRequest 发送 JS 对象