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


======================================================
注:本文源代码点此下载
======================================================

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

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个字节。 但相比规范性和可读性,还是推荐之前那种。

补充:感谢经典论坛上的crimsonet网友提醒,其实用self对象完全可以代替window。self是window的只读属性,并且永远指向window,所以用:

new(self.xmlhttprequest||activexobject)("microsoft.xmlhttp")

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


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值