日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/7/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【挑战极限】最短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字節,并且更規范:)

  (如果不是在內嵌框架里運行的話,top===window,還能-1。在框架內top引用頂層窗體,當然會有問題的了)

?

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的【挑战极限】最短AJAX创建代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。