【挑战极限】最短AJAX创建代码

标签: 挑战 极限 ajax | 发表时间:2011-10-09 00:14 | 作者:EtherDream We_Get
出处:http://www.cnblogs.com/

  下午写了篇最短地址栏载入脚本的文章。不过再怎么短仍然没什么意思,纯属娱乐下罢了。刚才想起能缩短个平时经常用到的代码就好了,于是现在一边写一边来研究,最短的XMLHTTP组建创建。

 

  假如你的脚本只针对某个浏览器开发,那么创建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);
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个字节。 但相比规范性和可读性,还是推荐之前那种。


 

 

作者: EtherDream 发表于 2011-10-09 00:14 原文链接

评论: 2 查看评论 发表评论


最新新闻:
· Kibo:键盘事件捕捉高手(2011-10-09 08:11)
· 亚马逊或将拆分Kindle Fire,成立独立公司Seesaw(跷跷板)负责移动产品运营(2011-10-09 08:10)
· 联通将对iPhone 4降价 含裸机和合约计划(2011-10-09 08:06)
· 唐骏已抛空联游股票并辞职(2011-10-09 08:06)
· 【身边人回忆乔布斯】之“苹果史学家”迈克尔·莫里茨(2011-10-09 07:57)

编辑推荐:最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用40

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [挑战 极限 ajax] 推荐:

【挑战极限】最短AJAX创建代码

- We_Get - 博客园-首页原创精华区
  下午写了篇最短地址栏载入脚本的文章. 不过再怎么短仍然没什么意思,纯属娱乐下罢了. 刚才想起能缩短个平时经常用到的代码就好了,于是现在一边写一边来研究,最短的XMLHTTP组建创建.   假如你的脚本只针对某个浏览器开发,那么创建XMLHTTP是很简单的一件事,用XMLHttpRequest或者ActiveXObject即可.

五大悖论,挑战智商极限

- - 左岸读书_blog
NO.1——说谎者悖论(1iar paradox or Epimenides’ paradox). 公元前6世纪古希腊哲学家伊壁孟德所创的四个悖论之一. 具体为:他说:“所有的克里特人都是撒谎者”. 如果他说的是实话,那么克里特人都是撒谎者,而伊壁孟德是克里特人,他必然说了假话. 如果他确实撒了谎,那么克里特人就都不是说谎的人,因而伊壁孟德也必然说了真话.

原生AJAX

- - Web前端 - ITeye博客
对象是ajax的基础,几乎所有的浏览器都支持他,只是创建方式不同,如IE5,IE6. 2、AJAX - 向服务器发送请求请求. 与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用. 然而,在以下情况中,请使用 POST 请求:. 无法使用缓存文件(更新服务器上的文件或数据库). 向服务器发送大量数据(POST 没有数据量限制).

初识Ajax

- - CSDN博客推荐文章
Ajax(Asynchronous JavaScript and XMLS异步JavaScript和XML)(“阿贾克斯”)技术. 完成页面的局部刷新,从而提升操作性能. AJAX 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术. 依赖的核心对象:XMLHttpRequest.

【挑战极限】最短的javascript: 地址栏载入脚本

- mingelz - 博客园-EtherDream の 原创空间
  相信大家都在地址栏里用javascript:的形式执行过脚本. 这种方法简单实用,测试比较短的脚本时经常用到. 并且可以添加到收藏夹里,随时点击调用.   不过脚本比较长的时候,需要复制密密麻麻一大段到地址栏里,显得很不美观,而且脚本修改起来也很不容易. 因此一般先把脚本写在单独一个文件里,然后用javascript: 的形式动态载入脚本到页面中.

tomcat7.0性能优化-挑战极限完整版

- - 企业架构 - ITeye博客
1.1 tomcat运行模式. 1.2 APR与tomcat-native安装. 到http://apr.apache.org/下载下面3个包. 2.安装apr-iconv. 4安装tomcat-native. 在tomcat目录下,找到bin/tomcat-native-1.1.24-src. 官方参考文档 http://tomcat.apache.org/tomcat-7.0-doc/config/http.html.

jquery ajax 跨域请求

- - 博客园_首页
使用 jquery 中的ajax  进行跨域请求. 说明:dataType 为  "jsonp"  ;type 只能为 GET.                    //处理错误. 后台处理代码 ValidAccountsExists.aspx.

ajax核心js代码

- - ITeye博客
                         //针对firefox,mozillar,opera,safari,IE7,IE8.                          //针对某些特定版本的mozillar浏览器的bug进行修正.                          //针对IE6,IE5.5,IE5.

谷奥: Google 内部头脑风暴出来的广告赚钱计划,挑战人类隐私极限

- rudan - 谷奥聚合——谷奥主站+谷安 aggregator
华尔街日报拿到了一份号称是Google内部备忘录的文件,该文件描述了公司未来的赚钱渠道展望,其中主要描绘的赚钱渠道主要集中在用户隐私数据交换和广告方面,其中一些想法几乎在挑战人类隐私极限,比如:. Get Paid:用户可以选择加入这个Get Paid项目,通过分享他们所有用户数据来得到ISP宽带服务商的优惠价格或是某种形式的返点.

反向Ajax,第1部分:Comet介绍

- 茫茫 - 译言-每日精品译文推荐
来源Reverse Ajax, Part 1: Introduction to Comet. web开发在过去的几年中有了很大的进展,我们已经远超了把静态网页链接在一起的做法,这种做法会引起浏览器的刷新,并且要等待页面的加载. 现在需要的是能够通过web来访问的完全动态的应用,这些应用通常需要尽可能的快,提供近乎实时的组件.