瀏覽器地址欄運行JavaScript代碼

這個很多人應該還是知道的,在瀏覽器地址欄可以直接運行JavaScript代碼,做法是以javascript:開頭后跟要執行的語句。比如:
javascript:alert('hello from address bar :)');

將以上代碼貼到瀏覽器地址欄回車后alert正常執行,一個彈窗神現。
需要注意的是如果是通過copy paste代碼到瀏覽器地址欄的話,IE及Chrome會自動去掉代碼開頭的javascript:,所以需要手動添加起來才能正確執行,而Firefox中雖然不會自動去掉,但它根本就不支持在地址欄運行JS代碼,sigh~
這一技術在我的另一篇博文《讓Chrome 接管郵件連接,收發郵件更方便了》中有使用到,利用在瀏覽器地址欄中執行JavaScript代碼將Gmail設置為系統的郵件接管程序。
瀏覽器地址欄運行HTML代碼
如果說上面那條小秘密知道的人還算多的話,這條秘笈知道的人就要少一些了,在非IE內核的瀏覽器地址欄可以直接運行HTML代碼!
比如在地址欄輸入以下代碼然后回車運行,會出現指定的頁面內容。
data:text/html,<h1>Hello, world!</h1>

image.png

你造么,可以把瀏覽器當編輯器
還是瀏覽器地址欄上做文章,將以下代碼貼到地址欄運行后瀏覽器變成了一個原始而簡單的編輯器,與Windows自帶的notepad一樣,吼吼。

data:text/html, <html contenteditable>
image.png

歸根結底多虧了HTML5中新加的contenteditable屬性,當元素指定了該屬性后,元素的內容成為可編輯狀態。

推而廣之,將以下代碼放到console執行后,整個頁面將變得可編輯,隨意踐踏吧~

document.body.contentEditable='true';

image.png

利用a標簽自動解析URL
很多時候我們有從一個URL中提取域名,查詢關鍵字,變量參數值等的需要,而萬萬沒想到可以讓瀏覽器方便地幫我們完成這一任務而不用我們寫正則去抓取。方法就在JS代碼里先創建一個a標簽然后將需要解析的URL賦值給a的href屬性,然后就得到了一切我們想要的了。

    var a = document.createElement('a');
    a.;
    console.log(a.host);

image.png

利用這一原理,稍微擴展一下,就得到了一個更加健壯的解析URL各部分的通用方法了。下面代碼來自James的博客

  <script>
   function  parseURL(url)  {    
        var  a  =   document.createElement('a');    
        a.href  =  url;    
        return  {        
            source:  url,
                    protocol:  a.protocol.replace(':', ''),
                    host:  a.hostname,
                    port:  a.port,
                    query:  a.search,
                    params:  (function() {            
                var  ret  =   {},
                                    seg  =  a.search.replace(/^\?/, '').split('&'),
                                    len  =  seg.length,
                     i  =  0,
                     s;            
                for (; i < len; i++)  {                
                    if (!seg[i])  { 
                        continue; 
                    }                
                    s  =  seg[i].split('=');                
                    ret[s[0]]  =  s[1];            
                }            
                return  ret;        
            })(),
                    file:  (a.pathname.match(/\/([^\/?#]+)$/i)  ||  [, ''])[1],
                    hash:  a.hash.replace('#', ''),
                    path:  a.pathname.replace(/^([^\/])/, '/$1'),
                    relative:  (a.href.match(/tps?:\/\/[^\/]+(.+)/)  ||  [, ''])[1],
                    segments:  a.pathname.replace(/^\//, '').split('/')    
        };
    }
    </script>

頁面擁有ID的元素會創建全局變量
在一張HTML頁面中,所有設置了ID屬性的元素會在JavaScript的執行環境中創建對應的全局變量,這意味著document.getElementById像人的闌尾一樣顯得多余了。但實際項目中最好老老實實該怎么寫就怎么寫,畢竟常規代碼出亂子的機會要小得多。

<div id="sample"></div>
<script type="text/javascript"> 
       console.log(sample);
</script>
image.png

加載CDN文件時,可以省掉HTTP標識
現在很流行的CDN即從專門的服務器加載一些通用的JS和CSS文件,出于安全考慮有的CDN服務器使用HTTPS方式連接,而有的是傳統的HTTP,其實我們在使用時可以忽略掉這個,將它從URL中省去。
<script src="http://domain.com/path/to/script.js"></script>

這一點在之前一篇譯文博客《jQuery編程最佳實踐》中也有提到。
利用script標簽保存任意信息
將script標簽設置為type='text'然后可以在里面保存任意信息,之后可以在JavaScript代碼中很方便地獲取。

<script type="text" id="template">  <h1>This won't display</h1></script>

 
var text = document.getElementById('template').innerHTML

CSS篇
關于CSS的惡作劇
相信你看完以下代碼后能夠預料到會出現什么效果。

*{    cursor: none!important;}
image.png

簡單的文字模糊效果
以下兩行簡單的CSS3代碼可達到將文字模糊化處理的目的,出來的效果有點像使用PS的濾鏡,so cool!

p {
    color: transparent;
    text-shadow: #111 0 0 5px;
}
image.png

垂直居中
有好多次博主都有這樣的需求,垂直居中顯示某個DIV,我們知道CSS中天然有水平居中的樣式text-align:center。唯獨這個垂直居中無解。
當然你可以將容器設置為display:table,然后將子元素也就是要垂直居中顯示的元素設置為display:table-cell,然后加上vertical-align:middle來實現,但此種實現往往會因為display:table而破壞整體布局,那還不如直接用table標簽了呢。
下面這個樣式利用了translate來巧妙實現了垂直居中樣式,需IE9+。

.center-vertical {    position: relative;    top: 50%;    transform: translateY(-50%);}

相比而言,水平居中要簡單得多,像上面提到的text-align:center,經常用到的技巧還有margin:0 auto。但對于margin大法也只在子元素寬度小于容器寬度時管用,當子元素寬度大于容器寬度時此法失效。
如法炮制,利用left和transform同樣可實現水平居中,不過意義不大,畢竟text-align和margin差不多滿足需求了。

.center-horizontal {    position: relative;    left: 50%;    transform: translateX(-50%); }

多重邊框
利用重復指定box-shadow來達到多個邊框的效果
在線演示
CSS Border with Box-Shadow Example

div { 
     box-shadow: 0 0 0 6px rgba(0, 0, 0, 0.2), 0 0 0 12px rgba(0, 0, 0, 0.2), 0 0 0 18px rgba(0, 0, 0, 0.2), 0 0 0 24px rgba(0, 0, 0, 0.2);   
     height: 200px;  
     margin: 50px auto; 
     width: 400px
}
image.png

實時編輯CSS
通過設置style標簽的display:block樣式可以讓頁面的style標簽顯示出來,并且加上contentEditable屬性后可以讓樣式成為可編輯狀態,更改后的樣式效果也是實時更新呈現的。此技巧在IE下無效。擁有此技能者,逆天也!

<!DOCTYPE html>
<html>
    <body>
        <style  contentEditable>
            body { color: blue }
        </style>
    </body>
</html>
image.png

創建長寬比固定的元素
通過設置父級窗口的padding-bottom可以達到讓容器保持一定的長度比的目的,這在響應式頁面設計中比較有用,能夠保持元素不變形。

<div >
    <div >
        this content will have a constant aspect ratio that varies based on the width. 
    </div>
</div>
image.png

CSS中也可以做簡單運算
通過CSS中的calc方法可以進行一些簡單的運算,從而達到動態指定元素樣式的目的。

.container{ background-position: calc(100% - 50px) calc(100% - 20px);}

JavaScript篇
生成隨機字符串
利用Math.random和toString生成隨機字符串,來自前一陣子看到的一篇博文。這里的技巧是利用了toString方法可以接收一個基數作為參數的原理,這個基數從2到36封頂。如果不指定,默認基數是10進制。略屌!

function generateRandomAlphaNum(len) {   
 var rdmString = "";  
    for (; rdmString.length < len; rdmString += Math.random().toString(36).substr(2));   
    return rdmString.substr(0, len);
}

image.png

整數的操作
JavaScript中是沒有整型概念的,但利用好位操作符可以輕松處理,同時獲得效率上的提升。
|0和~~是很好的一個例子,使用這兩者可以將浮點轉成整型且效率方面要比同類的parseInt,Math.round 要快。在處理像素及動畫位移等效果的時候會很有用。性能比較見此
var foo = (12.4 / 4.13) | 0;//結果為3var bar = ~~(12.4 / 4.13);//結果為3

順便說句,!!將一個值方便快速轉化為布爾值 !!window===true 。

重寫原生瀏覽器方法以實現新功能
下載的代碼通過重寫瀏覽器的alert讓它可以記錄彈窗的次數。

(function() {  
  var oldAlert = window.alert,    
    count = 0;   
    window.alert = function(a) {  
    count++;      
    oldAlert(a + "\n You've called alert " + count + " times now. Stop, it's evil!");  
  };
})();
alert("Hello World");

關于console的惡作劇
關于重寫原生方法,這里有個惡作劇大家可以拿去尋開心。Chrome的console.log是支持對文字添加樣式的,甚至log圖片都可以。于是可以重寫掉默認的log方法,把將要log的文字應用到CSS的模糊效果,這樣當有人試圖調用console.log()的時候,出來的是模糊不清的文字。好冷,我表示沒有笑。
是從這篇G+帖子的評論里看到的。使用之后的效果是再次調用log會輸出字跡模糊不清的文字。

var _log = console.log;console.log = function() { 
 _log.call(console, '%c' + [].slice.call(arguments).join(' '), 'color:transparent;text-shadow:0 0 2px rgba(0,0,0,.5);');
};
image.png

不聲明第三個變量的值交換
我們都知道交換兩個變量值的常規做法,那就是聲明一個中間變量來暫存。但鮮有人去挑戰不聲明中間變量的情況,下面的代碼給出了這種實現。蠻有創意 的。

var a=1,b=2;a=[b,b=a][0];
image.png

萬物皆對象
在JavaScript的世界,萬物皆對象。除了null和undefined,其他基本類型數字,字符串和布爾值都有對應有包裝對象。對象的一個特征是你可以在它身上直接調用方法。對于數字基本類型,當試圖在其身上調用toString方法會失敗,但用括號括起來后再調用就不會失敗了,內部實現是用相應的包裝對象將基本類型轉為對象。所以(1).toString()相當于new Number(1).toString()。因此,你的確可以把基本類型數字,字符串,布爾等當對象使用的,只是注意語法要得體。

同時我們注意到,JavaScript中數字是不分浮點和整形的,所有數字其實均是浮點類型,只是把小數點省略了而以,比如你看到的1可以寫成1.,這也就是為什么當你試圖1.toString()時會報錯,所以正確的寫法應該是這樣:1..toString(),或者如上面所述加上括號,這里括號的作用是糾正JS解析器,不要把1后面的點當成小數點。內部實現如上面所述,是將1.用包裝對象轉成對象再調用方法。

If語句的變形
當你需要寫一個if語句的時候,不妨嘗試另一種更簡便的方法,用JavaScript中的邏輯操作符來代替。

var day=(new Date).getDay()===0;//傳統if語句if (day) {
    alert('Today is Sunday!');
};
//運用邏輯與代替ifday&&alert('Today is Sunday!');

比如上面的代碼,首先得到今天的日期,如果是星期天,則彈窗,否則什么也不做。我們知道邏輯操作存在短路的情況,對于邏輯與表達式,只有兩者都真才結果才為真,如果前面的day變量被判斷為假了,那么對于整個與表達式來說結果就是假,所以就不會繼續去執行后面的alert了,如果前面day為真,則還要繼續執行后面的代碼來確定整個表達式的真假。利用這點達到了if的效果。

對于傳統的if語句,如果執行體代碼超過了1 條語句,則需要加花括號,而利用逗號表達式,可以執行任意條代碼而不用加花括號。

if(conditoin) alert(1),alert(2),console.log(3);

上面if語句中,如果條件成立則執行三個操作,但我們不需要用花括號將這三句代碼括起來。當然,這是不推薦的,這里是冷知識課堂:)

禁止別人以iframe加載你的頁面
下面的代碼已經不言自明了,沒什么好多說的。

if (window.location != window.parent.location) window.parent.location = window.location;
console.table

Chrome專屬,IE繞道的console方法。可以將JavaScript關聯數組以表格形式輸出到瀏覽器console,效果很驚贊,界面很美觀。

//采購情況var data = [{'品名': '杜雷斯', '數量': 4}, {'品名': '岡本', '數量': 3}];

console.table(data);

以上內容出自這里

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容