1. 程式人生 > >(轉)IE瀏覽器的選單欄和工具欄原理

(轉)IE瀏覽器的選單欄和工具欄原理

1、最基本的彈出視窗程式碼】
 其實程式碼非常簡單:
 <SCRIPT LANGUAGE="javascript">
 <!--
 window.open ('page.html')
 -->
 </SCRIPT>
 因為這是一段javascripts程式碼,所以它們應該放在<SCRIPT LANGUAGE="javascript">之間。<!-- 和 -->是對一些版本低的瀏覽器起作用,在這些老瀏覽器中不會將標籤中的程式碼作為文字顯示出來。要養成這個好習慣啊。
 window.open ('page.html') 用於控制彈出新的視窗page.html,如果page.html不與主視窗在同一路徑下,前面應寫明路徑,絕對路徑(http://)和相對路徑(../)均可。
 用單引號和雙引號都可以,只是不要混用。
 這一段程式碼可以加入HTML的任意位置,<head>和</head>之間可以,<body>間</body>也可以,越前越早執行,尤其是頁面程式碼長,又想使頁面早點彈出就儘量往前放。也可以,越前越早執行,尤其是頁面程式碼長,又想使頁面早點彈出就儘量往前放。
 
 【2、經過設定後的彈出視窗】
 下面再說一說彈出視窗的設定。只要再往上面的程式碼中加一點東西就可以了。我們來定製這個彈出的視窗的外觀,尺寸大小,彈出的位置以適應該頁面的具體情況。
 <SCRIPT LANGUAGE="javascript">
 <!--
 window.open ('page.html', 'newwindow', 'height=100, width=400, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no,status=no')
 //寫成一行
 -->
 </SCRIPT>
 引數解釋:
 <SCRIPT LANGUAGE="javascript"> js指令碼開始;
 window.open 彈出新視窗的命令;
 'page.html' 彈出視窗的檔名;
 'newwindow' 彈出視窗的名字(不是檔名),非必須,可用空''代替;
 height=100 視窗高度;
 width=400 視窗寬度;
 top=0 視窗距離螢幕上方的象素值;
 left=0 視窗距離螢幕左側的象素值;
 toolbar=no 是否顯示工具欄,yes為顯示;
 menubar,scrollbars 表示選單欄和滾動欄。
 resizable=no 是否允許改變視窗大小,yes為允許;
 location=no 是否顯示位址列,yes為允許;
 status=no 是否顯示狀態列內的資訊(通常是檔案已經開啟),yes為允許;
 </SCRIPT> js指令碼結束
 
 【3、用函式控制彈出視窗】
 下面是一個完整的程式碼:
 <html>
 <head>
 <script LANGUAGE="javascript">
 <!--
 function openwin() {
 window.open ("page.html", "newwindow", "height=100, width=400, toolbar=no,menubar=no, scrollbars=no, resizable=no, location=no, status=no")
 //寫成一行
 }
 //-->
 </script>
 </head>
 <body onload="openwin()">
 ...任意的頁面內容...
 </body>
 </html>
   這裡定義了一個函式openwin(),函式內容就是開啟一個視窗。在呼叫它之前沒有任何用途。
 怎麼呼叫呢?
   方法一:<body onload="openwin()"> 瀏覽器讀頁面時彈出視窗;
   方法二:<body onunload="openwin()"> 瀏覽器離開頁面時彈出視窗;
   方法三:用一個連線呼叫:<a href="#" onclick="openwin()">開啟一個視窗</a>
 注意:使用的“#”是虛連線。
   方法四:用一個按鈕呼叫:<input type="button" onclick="openwin()" value="開啟視窗">
 
 【4、同時彈出2個視窗】
 對原始碼稍微改動一下:
 <script LANGUAGE="javascript">
 <!--
 function openwin() {
 window.open ("page.html", "newwindow", "height=100, width=100, top=0,left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no,status=no")
 //寫成一行
 window.open ("page2.html", "newwindow2", "height=100, width=100, top=100,left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no,status=no")
 //寫成一行
 }
 //-->
 </script>
   為避免彈出的2個視窗覆蓋,用top和left控制一下彈出的位置不要相互覆蓋即可。最後用上面說過的四種方法呼叫即可。
 注意:2個視窗的name(newwindows和newwindow2)不要相同,或者乾脆全部為空。OK?
 
 【5、主視窗開啟檔案1.htm,同時彈出小視窗page.html】
 如下程式碼加入主視窗<head>區:
 <script language="javascript">
 <!--
 function openwin() {
 window.open("page.html","","width=200,height=200")
 }
 //-->
 </script>
 加入<body>區:
 <a href="1.htm" onclick="openwin()">open</a>即可。
 
 【6、彈出的視窗之定時關閉控制】
 下面我們再對彈出的視窗進行一些控制,效果就更好了。如果我們再將一小段程式碼加入彈出的頁面(注意是加入到page.html的HTML中,可不是主頁面中,否則...),讓它10秒後自動關閉是不是更酷了?
 首先,將如下程式碼加入page.html檔案的<head>區:
 <script language="javascript">
 function closeit() {
 setTimeout("self.close()",10000) //毫秒
 }
 </script>
 然後,再用<body onload="closeit()"> 這一句話代替page.html中原有的<BODY>這一句就可以了。(這一句話千萬不要忘記寫啊!這一句的作用是呼叫關閉視窗的程式碼,10秒鐘後就自行關閉該視窗。)
 
 【7、在彈出視窗中加上一個關閉按鈕】
 <FORM>
 <INPUT TYPE='BUTTON' value='關閉' onClick='window.close()'>
 </FORM>
 呵呵,現在更加完美了!
 
 【8、內包含的彈出視窗---一個頁面兩個視窗】
 上面的例子都包含兩個視窗,一個是主視窗,另一個是彈出的小視窗。通過下面的例子,你可以在一個頁面內完成上面的效果。
 <html>
 <head>
 <SCRIPT LANGUAGE="javascript">
 function openwin()
 {
 OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no");
 //寫成一行
 OpenWindow.document.write("<TITLE>例子</TITLE>")
 OpenWindow.document.write("<BODY BGCOLOR=#ffffff>")
 OpenWindow.document.write("<h1>Hello!</h1>")
 OpenWindow.document.write("New window opened!")
 OpenWindow.document.write("</BODY>")
 OpenWindow.document.write("</HTML>")
 OpenWindow.document.close()
 }
 </SCRIPT>
 </head>
 <body>
 <a href="#" onclick="openwin()">開啟一個視窗</a>
 <input type="button" onclick="openwin()" value="開啟視窗">
 </body>
 </html>
 看看OpenWindow.document.write()裡面的程式碼不就是標準的HTML嗎?只要按照格式寫更多的行即可。千萬注意多一個標籤或少一個標籤就會出現錯誤。記得用OpenWindow.document.close()結束啊。
 
 【9、終極應用--彈出的視窗之Cookie控制】
 回想一下,上面的彈出視窗雖然酷,但是有一點小毛病(沉浸在喜悅之中,一定沒有發現吧?)比如你將上面的指令碼放在一個需要頻繁經過的頁面裡(例如首頁),那麼每次重新整理這個頁面,視窗都會彈出一次,是不是非常煩人?:-(
 有解決的辦法嗎?當然有!我們使用cookie來控制一下就可以了。首先,將如下程式碼加入主頁面HTML的<HEAD>區:
 <script>
 function openwin(){
 window.open("page.html","","width=200,height=200")
 }
 function get_cookie(Name) {
 var search = Name + "="
 var returnvalue = "";
 if (documents.cookie.length > 0) {
 offset = documents.cookie.indexOf(search)
 if (offset != -1) {
 offset += search.length
 end = documents.cookie.indexOf(";", offset);
 if (end == -1)
 end = documents.cookie.length;
 returnvalue=unescape(documents.cookie.substring(offset, end))
 }
 }
 return returnvalue;
 }
 function loadpopup(){
 if (get_cookie('popped')==''){
 openwin()
 documents.cookie="popped=yes"
 }
 }
 </script>
   然後,用<body onload="loadpopup()">(注意不是openwin而是loadpop啊!)替換主頁面中原有的<BODY>這一句即可。你可以試著重新整理一下這個頁面或重新進入該頁面,視窗再也不會彈出了。真正的Pop-Only-Once!
 
 
 一種沒有邊框及選單欄、工具欄、位址列、狀態列等的無邊框視窗(CW)曾經一度很流行,被很多網站尤其是個人網站所採用,CW也有現成的原始碼供網友們使用,但是最初的CW使用起來很不方便,有兩個JS檔案,還要設定一些引數,這對一些初學者來講是很困難的事情。所以我就有了一個想法:重新寫一個全新的無邊框視窗,只用一個函式實現,以供網友方便使用。
 
   我給這個全新的無邊框視窗起名為NBW,NBW即No Border Window的縮寫,只是想區別於CW。這個無邊框視窗可以隨意拖動、最小化、關閉等等,不僅在IE5/IE6中測試通過,在騰訊的TE中測試也沒有問題。
 
 呼叫的過程如下:(noBorderWin函式是事先定義好的,後面會對函式的實現過程進行分析)
 
   noBorderWin(fileName,w,h,titleBg,moveBg,titleColor,titleWord,scr)
 
   各引數的說明如下:
   fileName :要開啟的檔案。
   w     :視窗的寬度(px)。
   h     :視窗的高度(px)。
   titleBg  :視窗“標題欄”的背景色以及視窗邊框顏色。
   moveBg  :拖動視窗時“標題欄”的背景色以及視窗邊框顏色。
   titleColor:視窗“標題欄”文字的顏色。
   titleWord :視窗“標題欄”中顯示的文字。
   scr    :視窗中是否出現滾動條。取值yes/no或者1/0。
 
   我們看到,視窗樣式全部在函式的引數中設定,從而保證了使用的便捷。比如,上面例子的程式碼如下:
   <a href=#none onclick=noBorderWin('test.html','400','240','#000000','#333333','#CCCCCC','一個無邊視窗的測試例子','yes');>點選此處將彈出NBW視窗</a>
 
   如何使用已經說完了,那麼,這個函式具體是如何實現的呢?下面,我們就以直接給出原始碼並加以註釋的方式進行講解。為了容易區分閱讀,程式碼部分使用灰色,註釋部分使用紅色。
 
   程式碼和註釋如下:
 //--------------------------------------------------------------------------------------------------
 <script language=javascript>
 //*****定製NBW視窗中幾個用到的圖片的路徑*****
 minimizebar="minimize.gif";   //視窗右上角最小化“按鈕”的圖片
 minimizebar2="minimize2.gif"; //滑鼠懸停時最小化“按鈕”的圖片
 closebar="close.gif";         //視窗右上角關閉“按鈕”的圖片
 closebar2="close2.gif";       //滑鼠懸停時關閉“按鈕”的圖片
 icon="icon.gif";              //視窗左上角的小圖示
 //***************定製結束*****************
 
 //*******開始定義noBorderWin()函式********
 function noBorderWin(fileName,w,h,titleBg,moveBg,titleColor,titleWord,scr)
 {
   var contents="<html>"+ //變數contents是一個字串變數,它是NBW視窗中的所有程式碼。
                "<head>"+
                "<title>"+titleWord+"</title>"+
                "<meta http-equiv=/"Content-Type/" content=/"text/html; charset=gb2312/">"+
                "<object id=hhctrl type='application/x-oleobject' classid='clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11'><param name='Command' value='minimize'></object>"+ //注意這一句,是實現視窗的最小化的關鍵。在後面,將通過hhctrl.Click()來實現最小化。
                "</head>"+
                "<body topmargin=0 leftmargin=0 scroll=no onselectstart='return false' ondragstart='return false'>"+ //為了使視窗更加逼真,在這一句中,屏弊了拖拽事件和選取事件。
                " <table height=100% width=100% cellpadding=0 cellspacing=1 bgcolor="+titleBg+" id=mainTab>"+
                " <tr height=18 style=cursor:default; onmousedown='x=event.x;y=event.y;setCapture();mainTab.bgColor=/""+moveBg+"/";' onmouseup='releaseCapture();mainTab.bgColor=/""+titleBg+"/";' onmousemove='if(event.button==1)self.moveTo(screenLeft+event.x-x,screenTop+event.y-y);'>"+ //在這一句中,實現了NBW視窗的任意拖拽,注意onmousedown、onmouseup和onmousemove時都“發生”了什麼,仔細體會其過程。
                " <td width=18 align=center><img height=12 width=12 border=0 src="+icon+"></td>"+
                " <td width="+w+"><span style=font-size:12px;color:"+titleColor+";font-family:宋體;position:relative;top:1px;>"+titleWord+"</span></td>"+ //以上兩句,將小圖示和標題欄的文字寫入。
                " <td width=14><img border=0 width=12 height=12 alt=最小化 src="+minimizebar+" onmousedown=hhctrl.Click(); onmouseover=this.src='"+minimizebar2+"' onmouseout=this.src='"+minimizebar+"'></td>"+ //通過前面提到的方法實現了視窗最小化按鈕的功能。
                " <td width=13><img border=0 width=12 height=12 alt=關閉 src="+closebar+" onmousedown=self.close(); onmouseover=this.src='"+closebar2+"' onmouseout=this.src='"+closebar+"'></td>"+ //實現視窗關閉按鈕的功能。
                " </tr>"+
                " <tr height=*>"+
                " <td colspan=4>"+
                " <iframe name=nbw_v6_iframe src="+fileName+" scrolling="+scr+" width=100% height=100% frameborder=0></iframe>"+ //在這一句中,將你要開啟的檔案寫到iframe中。
                " </td>"+
                " </tr>"+
                " </table>"+
                "</body>"+
                "</html>";
               //至此,已經定義完contents變數,在後面,我們將看到:它被寫入到NBW視窗中去。
 
   pop=window.open("","_blank","fullscreen=yes"); //開啟一個全屏視窗。
   pop.resizeTo(w,h); //用resize()方法將視窗定製成自己想要的大小。
   pop.moveTo((screen.width-w)/2,(screen.height-h)/2); //用moveTo()方法將視窗移到螢幕中心。
   pop.document.writeln(contents); //將視窗內容(即變數contents)寫進去。
 
   //至此,或許你認為它應該結束了。的確,在IE中,它的確已經結束了,但是在使用了IE核心的多視窗瀏覽器(比如騰訊的TE)中,一般window.open()是不會彈出新視窗的,而是出現在它的“多視窗”中的一個視窗,所以,後面的程式碼我們將通過視窗大小來判斷NBW視窗是否是獨立的視窗,如果不是,我們將使用showModalDialog()對話方塊做為一個過渡,重新“彈”出一個獨立的視窗。
 
   if(pop.document.body.clientWidth!=w||pop.document.body.clientHeight!=h) //通過判斷NBW視窗的實際大小來判斷NBW是否真正是一個獨立的視窗。如果不是,將執行後面的語句。
   {
     temp=window.open("","nbw_v6");
     temp.close(); //上面兩句的功能是如果原來有name=nbw_v6的視窗,則將其關閉。
     window.showModalDialog("about:<"+"script language=javascript>window.open('','nbw_v6','fullscreen=yes');window.close();"+"</"+"script>","","dialogWidth:0px;dialogHeight:0px"); //彈出一個對話方塊,再從對話方塊中彈出一個name=nbw_v6的全屏視窗,注意這時的視窗肯定是獨立的視窗了。
     pop2=window.open("","nbw_v6"); //彈出一個name=nbw_v6的視窗,因為前面彈出過一個name=nbw_v6的全屏視窗,所以這一次的視窗只是在那個視窗中重新整理了一下,而通過這樣一個過程則把那個視窗賦給了變數pop2。
     pop2.resizeTo(w,h); //用resize()方法將視窗定製成自己想要的大小。
     pop2.moveTo((screen.width-w)/2,(screen.height-h)/2); //用moveTo()方法將視窗移到螢幕中心。
     pop2.document.writeln(contents); //將視窗內容(即變數contents)寫進去。
     pop.close(); //將原來沒有真正“彈”出來的視窗關掉。
   }
 //*******結束定義noBorderWin()函式******** }
 </script>
 //--------------------------------------------------------------------------------------------------
 
   至此,全部程式碼講解完畢。我們可以看到,在實現過程中我們使用了iframe標記,所以現在的NBW視窗僅限在IE及使用IE核心的瀏覽器中使用