【挑战极限】最短AJAX创建代码
上回寫了最短地址欄載入腳本的文章。不過再怎么短仍然沒什么意思,純屬娛樂下罷了。剛才想起能縮短個平時經(jīng)常用到的代碼就好了,于是現(xiàn)在一邊寫一邊來研究,最短的XMLHTTP組建創(chuàng)建。
?
假如你的腳本只針對某個瀏覽器開發(fā),那么創(chuàng)建XMLHTTP是很簡單的一件事,用XMLHttpRequest或者ActiveXObject即可。但事實上絕大多數(shù)的時候,我們都要考慮兼容,于是我們通常寫成:
var x;if(window.ActiveXObject)
x = new ActiveXObject("Microsoft.XMLHTTP");
else
x = new XMLHttpRequest();
當(dāng)然,熟練的朋友更傾向于簡練的代碼:
var x = window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):
new XMLHttpRequest();
但也到此而已。這段代碼還能繼續(xù)壓縮嗎?我們不妨來探索下。
現(xiàn)在我們把一堆單詞: ActiveXObject,? "Microsoft.XMLHTTP", XMLHttpRequest, window 配上幾個符號重新排列起來,組合出一個語法正確并且能正常運行的表達(dá)式。
?
首先我們最容易想到的就是共用一個new。因為JS里面有個很強(qiáng)大的運算符“||”,相信大家都用過。所以我們先用||得出Class,然后用new實例化出instance。于是:
new (window.XMLHttpRequest || ActiveXObject("Microsoft.XMLHTTP"))?
很不幸,它沒能通過IE6,7的考驗。(IE8+已經(jīng)支持XMLHttpRequest了)
?
錯誤很簡單,就在ActiveXObject("Microsoft.XMLHTTP")上。Automation 服務(wù)器不能創(chuàng)建對象。?
在IE里,ActiveXObject(...)之前必須帶上new,否則就會出現(xiàn)上面的錯誤。但請注意了,ActiveXObject后面是帶參數(shù)調(diào)用的。如果我們單獨引用ActiveXObject這個函數(shù),然后再實例化,結(jié)果會如果呢?我們測試下:
var x = new ref("Microsoft.XMLHTTP");
x.open("GET", "1.html", true);
x.send();
alert(x.responseText)
結(jié)果不但沒有報錯,并且成功的顯示出了文字。這說明window.ActiveXObject這個方法是可以引用調(diào)用,但必須用new才能創(chuàng)建組建。這很好理解:function ActiveXObject(){}的Native Code會判斷當(dāng)前是new call還是direct call,如果不是new call就報錯。這意味著你不能預(yù)先創(chuàng)建出XMLHTTP的Class,而必須用ActiveXObject的工廠形式。
既然事實如此,我們只能用XMLHttpRequest || ActiveXObject這樣的邏輯。如果帶上new,我們就得到這樣的代碼:
new (window.XMLHttpRequest || ActiveXObject)這對XHR的創(chuàng)建已經(jīng)夠了,但是ActiveX還需要提供一個參數(shù)指定組件名。這個參數(shù)加在哪里好呢?不用多慮,就放在最后!
?
因為XMLHttpRequest的構(gòu)造函數(shù)是不帶參數(shù)的,而JS是個弱類型語言,所以你即便給他指定一個參數(shù)也不會出問題。于是最后,我們用一行表達(dá)式即可創(chuàng)建:
new (window.XMLHttpRequest || ActiveXObject)("Microsoft.XMLHTTP")
因為IE8+即支持 XMLHttpRequest 和 ActiveXObject,因此上面 || 左右順序決定了IE8+優(yōu)先使用哪種。
不過,這還不是最簡短的!沒錯,還有更精簡的,但顯得不是特別正規(guī),甚至有點晦澀。
?
縱觀上述代碼,其中的window顯得有點多余,但又不能去掉。假如有個簡單的辦法判斷是(或者不是)IE瀏覽器,我們就可以用 ?: 運算符來代替 || 了。
?
曾經(jīng)有個老外寫過最簡短判斷IE的辦法,只需6個字節(jié) !-[1,] ?原理就是IE特有的特征,數(shù)組處理最后項的bug。利用這個辦法,我們還可以進(jìn)一步壓縮代碼:
new(-[1,]?XMLHttpRequest:ActiveXObject)("Microsoft.XMLHTTP")
無疑,這是最簡短的XMLHTTP創(chuàng)建代碼了!正好60個字節(jié)。 但相比規(guī)范性和可讀性,還是推薦之前那種。
補充:感謝經(jīng)典論壇上的crimsonet網(wǎng)友提醒,其實用self對象完全可以代替window。self是window的只讀屬性,并且永遠(yuǎn)指向window,所以用:
new(self.XMLHttpRequest||ActiveXObject)("Microsoft.XMLHTTP")
也正好是60字節(jié),并且更規(guī)范:)
(如果不是在內(nèi)嵌框架里運行的話,top===window,還能-1。在框架內(nèi)top引用頂層窗體,當(dāng)然會有問題的了)
?
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的【挑战极限】最短AJAX创建代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [zz]Spring MVC 之 Sim
- 下一篇: Opencv中cvCopy() 和cvC