1. 程式人生 > >瀏覽器位址列javascript

瀏覽器位址列javascript

0. 前言

所謂IE位址列表示式,就是在IE的位址列中輸入 javascript:<程式碼>,執行某些功能,來動態改變原有頁面的引數以達到某些目的,例如開放被禁止的按鈕、顯示原本隱藏的圖片等等。本文將就IE位址列的使用方法做一個詳細的說明。

1. 表示式的書寫方法

在IE的位址列中輸入 javascript:<程式碼>,即可在當前頁面上直接執行指定的程式碼並立即看到效果。而且,<程式碼>中可以包含多條語句,甚至可以包含 if/for 等流程控制語句。

程式碼一般有兩種寫法:

javascript:<表示式>該寫法將會執行表示式,並將表示式的結果在當前頁面內顯示。

javascript:<函式>該表示式將會執行指定的函式,而當前頁面的顯示不會受到影響。

那麼IE如何區分位址列中輸入的程式碼到底是函式還是表示式?其實很簡單,程式碼的最後一條語句以引數列表 () 結束,則作為函式處理,不更新頁面顯示;程式碼的最後一條語句不以 () 結束,則作為表示式處理,在當前頁面內顯示錶達式的計算結果。

例如,在IE的位址列中輸入:

javascript:1+2該表示式的末尾並非引數列表,因此IE將1+2看作表示式,執行結果將顯示在當前視窗內:

而下面這段程式碼:

javascript:alert("Hello, world!")程式碼末尾為引數列表,因此IE將其看作函式,執行之後將出現彈出視窗,但是網頁的內容不會有任何變化。再如,

javascript:alert該程式碼執行後,當前視窗內顯示:

[object]這是因為程式碼末尾不是引數列表,因此IE將其作為表示式來處理。alert 為 window 物件的一個方法,也算作“[object]”,所以出現了上面的結果。

再看下面的例子:

javascript:a=1;b=2;c=3;alert(a+b*c)雖然該段程式碼中包含了賦值表示式和alert()函式,但由於程式碼最末尾是引數列表,因此頁面內容不會更新。

2. 將表示式轉化為函式

通常我們希望使用 javascript:<函式> 這種格式,因為 javascript:<表示式> 會改變頁面內容而使得修改失去意義。但有時我們不得不使用賦值表示式來達到目的,這就需要將表示式轉換為函式來執行。這就需要利用一個特殊的函式:void()。該函式帶有一個引數。

比較常用的轉化方式有兩種。一種是將表示式作為void()函式的引數,例如:

javascript:void(a=1)執行之後頁面內容沒有任何變化,但是頁面內名為a的變數已經賦值為1了。另一種方法是在整個程式碼的最後執行void()函式,例如:

javascript:a=1;void(0)也可以達到同樣的效果。

在網上通常可以找到一些網頁的hack程式碼,例如:

javascript:void(document.all.btn1.disabled=false);void(document.all.btn2.disabled=false)該段程式碼對每一個表示式執行了一次 void()函式。實際上有更簡單的方法,只需要執行一次即可:

javascript:document.all.btn1.disabled=false;document.all.btn2.disabled=false;void(0)

3. 常用hack程式碼

這裡介紹一些常用的 hack 程式碼段,大家可以靈活運用。

3.1 查詢頁面內元素

使用 document 物件的 all 集合和 getElement 系列方法可以輕易地找到頁面上各種元素。如果知道一個元素的id(假設為myelement),則可以通過下面兩種方式獲得該元素:

document.all.myelementdocument.getElementById('myelement')如果不知道元素的id,但知道元素的HTML標籤名(假設為TAGNAME),則可以通過下面的程式碼獲得所有相同標籤的元素:

document.getElementsByTagName('TAGNAME')返回值為一個集合,通過該集合的 item 方法可以獲取其中的一個元素。例如,修改頁面上的第三個超連結的顏色為綠色:

javascript:document.getElementsByTagName('A').item(2).style.color="green";void(0)將頁面上所有的 TD 元素的背景顏色修改為紅色:

javascript:tds=document.getElementsByTagName('TD');for(i=0;i<tds.length;i++){tds.item(i).style.backgroundColor="red";}void(0)

3.2 定義函式

可以在位址列中直接書寫function語句來定義函式。例如,先在位址列中輸入:

javascript:function hello(){alert("Hello!");}確定之後,再次在位址列中輸入:

javascript:hello()即可看到彈出視窗。

3.3 呼叫函式

其實在位址列裡執行指令碼的作用域就是當前頁面的指令碼作用域,利用這個特點我們除了可以簡單的執行指令碼語句,還可以輔助我們除錯指令碼,比如我希望察看一些變數的值,例javascript:alert(mythinkingNumber),呼叫函式,例javascript:getURL(),例javascript:alert(Math.abs(-10)+10),而我們又不需要進入複雜的除錯模式。

這裡我們除了可以在位址列裡寫JavaScript:外,同時還可以寫vbscirpt: alert("ok!"),ecmascript:和jscirpt。不過ecmascript會自動被轉為javascirpt,jscript會被轉為vbscript。

比如我們學校教務處網站,在評教的時候必須要在頁面停留2分鐘才行,
javascript:document.frames[1].document.frames[2].setFlag();
在位址列輸入上面這行程式碼,並按回車鍵,就可以取消2分鐘的等待時間,原理很簡單,教務處網站採用的是使用者本地驗證,所以這行程式碼就是呼叫時間到了的函式setFlag(),重置了一個標記而已,以上程式碼是二次框架頁面的用法。

3.4 顯示效果類特效

通過各個元素的 style.zoom 屬性可以設定該元素的顯示比例。例如,將頁面整體顯示比例擴大為150%:

javascript:document.style.zoom='150%';void(0)通過各個元素的 style.display 和 style.visibility 屬性可以顯示/隱藏該元素。style.display=""可以顯示元素,style.display="none"可以隱藏元素,而且被隱藏的元素不會佔用頁面位置,就像根本不存在一樣;style.visibility=false可以隱藏元素,但是被隱藏的元素還會保持原有的位置和大小;style.visibility=true可以顯示元素。例如,隱藏所有圖片:

javascript:a=document.getElementsByTagName('IMG');for(i=0;i<a.length;i++)a.item(i).style.visibility=false;void(0)3.4 其他

顯示頁面所有連結:

javascript:a=document.getElementsByTagName("A");newwindow=window.open("newwindow");newwindow.document.open();for(i=0;i<a.length;i++){newwindow.document.write("<a href='"+a.item(i).href+"'>"+a.item(i).innerText+"</a><br>");}newwindow.document.close();void(0)

編輯網頁

在位址列輸入下面的程式碼按enter,網頁上所有元素都能變成可編輯狀態,你可以移動、調整元素大小。如果你只是討厭某個網站想發洩一下,建議你使用NetDisater。

程式碼如下:

javascript:document.body.contentEditable='true'; document.designMode='on'; void 0

無敵風火輪

在位址列執行下面的程式碼可使頁面上所有圖片元素一個接一個地轉圈,這種效果最好的實現地方就是圖片搜尋了:

改變程式碼裡的“img”成任何網頁上有的字元,可以使這些字元做無敵風火輪運動。

程式碼如下:

javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.getElementsByTagName("img"); DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=(Math.sin(R*x1+i*x2+x3)*x4+x5)+"px"; DIS.top=(Math.cos(R*y1+i*y2+y3)*y4+y5)+"px"}R++}setInterval('A()',5); void(0);

顯示網頁中的所有圖片
javascript:Ai7Mg6P='';for%20(i7M1bQz=0;i7M1bQz<document.images.length;i7M1bQz++){Ai7Mg6P+='<img%20src='+document.images[i7M1bQz].src+'><br>'};if(Ai7Mg6P!=''){document.write('<center>'+Ai7Mg6P+'</center>');void(document.close())}else{alert('No%20images!')}

顯示網頁中除圖片的其他
javascript:for(jK6bvW=0;jK6bvW<document.images.length;jK6bvW++){void(document.images[jK6bvW].style.visibility='hidden')}

顯示網頁原始碼(對於加密過的可以直接顯示其加密前的原始碼)
javascript:s=document.documentElement.outerHTML;document.write('<body></body>');document.body.innerText=s;

網頁放大1.5倍
javascript:void(s=document.body.style);void(z=s.getAttribute('zoom'));if(z){s.setAttribute('zoom',(parseInt(z)+50)+'%');}else s.setAttribute('zoom','150%')

網頁縮小0.5倍
javascript:void(s=document.body.style);void(z=s.getAttribute('zoom'));if(z){s.setAttribute('zoom',(parseInt(z)-50)+'%');}else s.setAttribute('zoom','50%')