假如你的脚本只针对某个浏览器开发,那么创建XMLHTTP是很简单的一件事,用XMLHttpRequest或者ActiveXObject即可。但事实上绝大多数的时候,我们都要考虑兼容,于是我们通常写成:

var x;
if(window.ActiveXObject)
x = new ActiveXObject("Microsoft.XMLHTTP");
else
x = new XMLHttpRequest();

当然,熟练的朋友更倾向于简练的代码:

var x = window.ActiveXObject?
new ActiveXObject("Microsoft.XMLHTTP"):
new XMLHttpRequest();

但也到此而已。这段代码还能继续压缩吗?我们不妨来探索下。

现在我们把一堆单词: ActiveXObject, "Microsoft.XMLHTTP", XMLHttpRequest, window 配上几个符号重新排列起来,组合出一个语法正确并且能正常运行的表达式。

首先我们最容易想到的就是共用一个new。因为JS里面有个很强大的运算符“||”,相信大家都用过。所以我们先用||得出Class,然后用new实例化出instance。于是:

new (window.XMLHttpRequest || ActiveXObject("Microsoft.XMLHTTP"))

很不幸,它没能通过IE6,7的考验。(IE8+已经支持XMLHttpRequest了)错误很简单,就在ActiveXObject("Microsoft.XMLHTTP")上。Automation 服务器不能创建对象。

在IE里,ActiveXObject(...)之前必须带上new,否则就会出现上面的错误。但请注意了,ActiveXObject后面是带参数调用的。如果我们单独反射出ActiveXObject这个函数,然后再实例化,结果会如果呢?我们测试下:

var ref = ActiveXObject;
var x = new ref("Microsoft.XMLHTTP"); x.open("GET", "1.html", true);
x.send();
alert(x.responseText)

结果不但没有报错,并且成功的显示出了文字。这说明window.ActiveXObject这个方法是可以反射调用,但必须用new才能创建组建。这很好理解:function ActiveXObject(){}的Native Code会判断当前是new call还是direct call,如果不是new call就报错。这意味着你不能预先创建出XMLHTTP的Class,而必须用ActiveXObject的工厂形式。

既然事实如此,我们只能用XMLHttpRequest || ActiveXObject这样的逻辑。如果带上new,我们就得到这样的代码:

new (window.XMLHttpRequest || ActiveXObject)

这对XHR的创建已经够了,但是ActiveX还需要提供一个参数指定组件名。这个参数加在哪里好呢?不用多虑,就放在最后。

因为XMLHttpRequest的构造函数是不带参数的,而JS是个弱类型语言,所以你即便给他指定一个参数也不会出问题。于是最后,我们用一行表达式即可创建:

new (window.XMLHttpRequest || ActiveXObject)("Microsoft.XMLHTTP")

因为IE8+即支持 XMLHttpRequest 和 ActiveXObject,因此上面 || 左右顺序决定了IE8+优先使用哪种。

不过,这还不是最简短的!没错,还有更精简的,但显得不是特别正规,甚至有点晦涩。

纵观上述代码,其中的window显得有点多余,但又不能去掉。假如有个简单的办法判断是(或者不是)IE浏览器,我们就可以用 ?: 运算符来代替 || 了。

曾经有个老外写过最简短判断IE的办法,只需6个字节 !-[1,] 原理就是IE特有的特征,数组处理最后项的bug。利用这个办法,我们还可以进一步压缩代码:

new(-[1,]?XMLHttpRequest:ActiveXObject)("Microsoft.XMLHTTP")

无疑,这是最简短的XMLHTTP创建代码了!正好60个字节。 但相比规范性和可读性,还是推荐之前那种。

其实用self对象完全可以代替window。self是window的只读属性,并且永远指向window,所以用:

new(self.XMLHttpRequest||ActiveXObject)("Microsoft.XMLHTTP")

也正好是60字节,并且更规范:)

简短的创建Ajax对象代码的更多相关文章

  1. Ajax--Ajax基于原生javascript:创建Ajax对象、链接服务器、发送请求、接受响应结果

    Ajax概述 异步:指某段程序执行时不会阻塞其它程序执行,其表现形式为程序的执行顺序不依赖程序本身的书写顺序,相反则为同步. 同步请求: 请求是由浏览器发送 页面会刷新 异步请求: 请求是由浏览器的一 ...

  2. 创建ajax对象并兼容多个浏览器方法简单记录

    这篇文章主要介绍了如何创建ajax对象并兼容多个浏览器,需要的朋友可以参考下<script> function createAjax(){ var request=false; //win ...

  3. 创建Ajax对象

    针对不同版本浏览器插件Ajax对象. <script> function createAjax(){ var request=false; //window对象中有XMLHttpReque ...

  4. JavaScript之Ajax(一)创建Ajax对象

    // 支持浏览器的源码 function AjaxObject() { var AjaxRequest; // 缓存XHR对象便于 Ajax 使用 try { // Opera 8.0+, Firef ...

  5. 如何创建ajax对象?

    1.IE低版本 2.非IE和高版本 <script> function createAjax(){ var request=false; //window对象中有XMLHttpReques ...

  6. Ajax详解及其案例分析------如何获得Ajax对象,使用Ajax对象发送GET和POST请求,校验用户名,POST和GET请求时的乱码处理,实现级联的下拉列表

    本节主要内容预览: 1 获得Ajax对象 2 使用Ajax对象发送GET请求 3 使用Ajax对象发送POST请求 4 使用Ajax校验用户名 5 POST请求时的乱码处理 6 GET请求时的乱码处理 ...

  7. 几种创建XMLHttpRequest对象的方法

    XMLHttpRequest对象,也就是Ajax交互的核心对象. 这里列举三种创建Ajax对象的方法. 第一种: <!DOCTYPE html> <html> <head ...

  8. ajax分页代码

    <meta charset="utf-8"><?php//连接数据库$link = mysqli_connect('127.0.0.1','root','root ...

  9. 不同浏览器创建 ajax XMLHTTPRequest对象的方法及兼容性问题总结

    XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始. 了解XMLHttpRequest 对象就先从创建XMLHttpReques ...

随机推荐

  1. ipython快捷键操作及常用命令

    Ipython shell命令- Ctrl-P 或上箭头键 后向搜索命令历史中以当前输入的文本开头的命令- Ctrl-N 或下箭头键 前向搜索命令历史中以当前输入的文本开头的命令- Ctrl-R 按行 ...

  2. html , body , margin , overflow 之大乱战

    <!DOCTYPE html> <html> <head> <style> html,body{ margin:0 ;padding:0 } div{m ...

  3. js备忘录5

    函数的全解析 原文链接: http://mp.weixin.qq.com/s?src=11&timestamp=1509672643&ver=491&signature=9fD ...

  4. Beta发布 _thunder_文案+美工展示

    作业要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/1366 团队介绍:thunder 组成员及各位博客地址: 1.王航:htt ...

  5. jQuery ajax - get() 方法

    AJAX = Asynchronous javaScript and XML.  AJAX 是一种创建快速动态网页的技术. AJAX 通过在后台与服务器交换少量数据的方式,允许网页进行异步更新.这意味 ...

  6. win10频繁提示证书即将过期怎么办

    最近几天每次开机都会提示许可证即将过期 ”Windows+R”打开“运行”窗口,输入“slmgr.vbs -xpr”并点击“确定”,弹出的窗口确实显示过期时间在本月1.29过期 百度各种激活方法后,发 ...

  7. matlab for 运算的提速

    [1]主要思想:matlab是按列存储,定义s(nums,1)比定义s(1,nums)要快哦                       需要重复query的元素看看能不能再for之前就定义好 经典案 ...

  8. 深度学习:卷积神经网络(convolution neural network)

    (一)卷积神经网络 卷积神经网络最早是由Lecun在1998年提出的. 卷积神经网络通畅使用的三个基本概念为: 1.局部视觉域: 2.权值共享: 3.池化操作. 在卷积神经网络中,局部接受域表明输入图 ...

  9. html select options & vue h render

    html select options & vue h render https://developer.mozilla.org/en-US/docs/Web/HTML/Element/opt ...

  10. 【Django】用pycharm初学习使用Django

    开发框架流程 M V C(99%的开发都是这种流程.) 1.URL控制器 2.Views 视图 3.models 库   1.首先创建一个Django   2.创建成功后里面几个模块的功能   用它来 ...