多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > web前端 > jscript > 最短的javascript代碼: 地址欄載入腳本

最短的javascript代碼: 地址欄載入腳本

來源:程序員人生   發(fā)布時(shí)間:2014-06-16 05:44:32 閱讀次數(shù):2650次

相信大家都在地址欄里用javascript:的形式執(zhí)行過腳本。這種方法簡(jiǎn)單實(shí)用,測(cè)試比較短的腳本時(shí)經(jīng)常用到。并且可以添加到收藏夾里,隨時(shí)點(diǎn)擊調(diào)用。

不過腳本比較長(zhǎng)的時(shí)候,需要復(fù)制密密麻麻一大段到地址欄里,顯得很不美觀,而且腳本修改起來也很不容易。因此一般先把腳本寫在單獨(dú)一個(gè)文件里,然后用javascript: 的形式動(dòng)態(tài)載入腳本到頁面中。不少網(wǎng)頁插件都是用這個(gè)方法載入。

平時(shí),我們用最簡(jiǎn)單的代碼實(shí)現(xiàn)動(dòng)態(tài)載入:

javascript:var o=document.createElement('script');o.src='...';document.body.appendChild(o);void(0)

當(dāng)然,這對(duì)于載入插件來說足夠OK了。但是不久前看到一個(gè)稍有修改的方法,讓我開始琢磨這段代碼究竟可以壓縮到多短!

他的代碼大致相同,只是更嚴(yán)謹(jǐn): 

javascript:(function(o){o.src='...';document.body.appendChild(o)})(document.createElement('script'));void(0)

雖然代碼比先前的還長(zhǎng),但是將變量置于閉包中,避免潛在的沖突。并且將  document.createElement作為閉包的參數(shù),巧妙的節(jié)省了一個(gè)var單詞。

閑來無事,于是考慮起這代碼能否精簡(jiǎn)再精簡(jiǎn)。順便復(fù)習(xí)下js里面的各種特性。

當(dāng)然,首先默認(rèn)了幾個(gè)地址欄載入腳本要遵循的規(guī)則:

1. 不引入全局變量

2. 兼容主流瀏覽器

3. 載入過程不影響頁面 

> 不影響全局變量,我們需要使用閉包來隱藏我們的私有變量;

> 兼容主流瀏覽器,就必須使用標(biāo)準(zhǔn)的方法,兼容性判斷只會(huì)增加代碼長(zhǎng)度;

> 如果簡(jiǎn)單的使用innerHTML添加元素,就有可能導(dǎo)致存在的元素刷新;

于是我們開始逐步分析。

顯然,最先想到的就是匿名閉包的調(diào)用。

通常我們都是用:  (function(){})()  的形式調(diào)用一個(gè)匿名閉包。注意紅色的優(yōu)先級(jí)括號(hào)是必不可缺的,否則就是一個(gè)錯(cuò)誤的語法。

但也可以使用另一種形式:+function(){}() 前面的+號(hào)可以換成-!~等等一元操作符。不過這僅僅是1字節(jié)之差。

另一個(gè)顯然的,就是可以把void(0)的參數(shù)替換成閉包調(diào)用的表達(dá)式。void雖然只是個(gè)關(guān)鍵字,但有類似函數(shù)的功能,對(duì)于任何參數(shù)都返回undefined。如果沒有void,在地址欄執(zhí)行了javascript:后,頁面就變成了腳本表達(dá)式返回值,大家應(yīng)該都見過。

于是經(jīng)過顯而易見的觀察,略微減少了3個(gè)字符。

javascript:void(+function(o){o.src='...';document.body.appendChild(o)}(document.createElement('script')))

不過上面都是淺層次的觀察。現(xiàn)在我們來仔細(xì)的分析。

我們?yōu)槭裁匆褂瞄]包,就是為了防止我們的變量和頁面里的沖突。那么可以不使用變量嗎?想要不出現(xiàn)變量,唯一辦法就是使用鏈?zhǔn)降倪B等操作:利用上個(gè)操作的返回值作為下個(gè)操作的參數(shù)。這段代碼共有3個(gè)操作:創(chuàng)建腳本元素/腳本元素src賦值/添加腳本元素。仔細(xì)參考下W3C的手冊(cè),DOM.appendChild不僅可以添加元素,并且返回值也是此元素。而src賦值和元素添加的順序可以互換。因此我們可以用鏈?zhǔn)讲僮鳎瑥亩鴱氐赘鎰e閉包和變量:

javascript:void(document.body.appendChild(document.createElement('script')).src='...')

這一步,我們精簡(jiǎn)了19個(gè)字符!  

我們繼續(xù)觀察。上面的代碼里出現(xiàn)了2個(gè)document。我們?nèi)绻靡粋€(gè)短變量代替的話又可以減少字?jǐn)?shù)。但使用了變量的話又會(huì)出現(xiàn)沖突的問題,于是又要用到閉包。。。仔細(xì)的回憶下,js里有個(gè)我們平時(shí)不推薦使用的東西:with。沒錯(cuò),使用他就可以解決這個(gè)問題。我是只需with(document){...}即可。因?yàn)橹挥幸恍写a,所以那對(duì)大括號(hào)也可以去掉。于是又減少了4個(gè)字符:

javascript:with(document)void(body.appendChild(createElement('script')).src='...')

值得注意的是,void不再套在最外層了,因?yàn)閣ith和if, for他們一樣,不再是表達(dá)式,而是語句了。

此時(shí),代碼里的每句都是各司其責(zé),連重復(fù)的單詞都找不到了。我們還能否再精簡(jiǎn)?如果硬要找,那也只得從void這家伙身上找了。如果去掉它,那地址欄執(zhí)行后,頁面就變成了腳本元素的src字符了。顯然刪不得。但我們可以嘗試換個(gè),比如alert。在對(duì)話框過后,頁面仍保留著。

先前說了,void的功能僅僅是返回一個(gè)undefined,而alert沒有返回值。這里就不得不說javascript與其他語言的不同之處了。在其他的語言里,幾乎都有函數(shù)/過程這么兩概念,過程就是沒有返回值的函數(shù)。不過js可不同,在js里任何函數(shù)都有一個(gè)返回值,即使“ 沒有返回值 ”也是一種返回值,他就是undefined。所以alert和void有著相同的返回值:undefined。只要地址欄執(zhí)行后結(jié)果是它,頁面就不會(huì)轉(zhuǎn)跳,而其他諸如false,0,null,NaN等等都不行。

于是我們只需讓表達(dá)式返回的是undefined就可以了,但必須比void()這幾個(gè)字符短。要產(chǎn)生一個(gè)undefined,除了它字面常量外,另外就是調(diào)用沒有返回值的函數(shù),或者訪問一個(gè)對(duì)象不存在的屬性。我們要盡可能簡(jiǎn)短。如果頁面里使用了jQuery的話,我們用$.X就可以得到一個(gè)undefined。但沒用jq的話,就不能保證是否存在變量$了。既然找不到足夠簡(jiǎn)短的全局變量,我們可以用json創(chuàng)造個(gè)匿名的,比如[]或{},然后訪問他的不存在屬性,比如[].X。于是,我們可以告別void了:

javascript:with(document)body.appendChild(createElement('script')).src='...';[].X

這樣就減少了1個(gè)字節(jié)。我們還可以合并下代碼,用表達(dá)式替換X:

javascript:with(document)[][body.appendChild(createElement('script')).src='...']

這樣又減少了1個(gè)字節(jié)。

事實(shí)上,js里的任何一個(gè)變量都是繼承于Object的,即使數(shù)字也不例外。所以,我們完全可以用一個(gè)數(shù)字替換[],這樣更進(jìn)一步減少1個(gè)字符:

javascript:with(document)0[body.appendChild(createElement('script')).src='...']

到此,代碼里除了src字符外,縮短到76字節(jié)。

當(dāng)然,最終的極限仍在探索中。。。

配合新浪微博的短域名服務(wù),我們可以縮短腳本的URL,例如:

javascript:with(document)0[body.appendChild(createElement('script')).src='http://t.cn/ShMoyb']

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 伊人久久大香线蕉观看 | 欧美久久超级碰碰碰二区三区 | 亚洲乱码在线观看 | 日韩免费高清 | 国产粉嫩00福利福利福利 | 亚洲第九十七页 | 爱爱永久免费视频网站 | 午夜私人影院在线观看 视频 | 亚洲国产第一 | 欧美gv免费video在线观看 | 欧洲自拍偷拍 | 欧美金妇欧美乱妇xxxx | 欧美日韩中文 | 免费国产高清精品一区在线 | 日韩理论片在线看免费观看 | 国产日韩欧美一区二区三区视频 | 欧美中文字幕一区 | 久久久久777777人人人视频 | 精品毛片视频 | 国产欧美一区二区成人影院 | 国产亚洲精品日韩已满十八 | 亚洲精品久久片久久 | 欧美日韩亚洲精品一区二区三区 | 国产日韩亚洲欧美 | 国产欧洲亚洲 | 永久手机看片福利盒子 | 亚洲 欧美 日韩中文字幕一区二区 | 狼人天堂网 | 日本免费新一区二区三区 | 亚洲 欧美 中文 日韩欧美 | 岛国午夜视频 | 日本美女影院 | 国产精品卡哇伊小可爱在线观看 | 欧美a在线看 | 武则天级淫片a级中文 | 在线欧美日韩精品一区二区 | 老司机午夜精品网站在线观看 | free日本xxxx另类hd | 国产精品久久久久久久久久免费 | 亚洲国产精品一区二区三区在线观看 | 国产精品久久久久久久久久妇女 |