window.onload and showModalDialog根據內容自動調整視窗大小
1 showModalDialog根據內容自動調整視窗大小 :在對話方塊的頁面中加入如下程式碼:
- window.onload = function()
- {
- if( document.body.scrollWidth > (window.screen.availWidth-100) ){
- window.dialogWidth = (window.screen.availWidth-100).toString() + "px"
- }else{
- window.dialogWidth = (document.body.scrollWidth +50).toString() +
- }
- if( document.body.scrollHeight > (window.screen.availHeight-70) ){
- window.dialogHeight = (window.screen.availHeight-50).toString() + "px"
- }else{
- window.dialogHeight = (document.body.scrollHeight +115).toString() + "px"
- }
- window.dialogLeft = ((window.screen.availWidth - document.body.clientWidth) / 2).toString() +
- window.dialogTop = ((window.screen.availHeight - document.body.clientHeight) / 2).toString() + "px"
- }
2window.onload or other
在網頁設計中,總要用到一些動態效果,而這些效果之中,有一些是需要頁面載入完成時才可以做的,比如要給頁面中的每一個連結加上hover時的特效,那麼就需要在頁面的所有程式碼已經下載完畢時再進行特效,這樣才能保證頁面裡的每一個連結都不會遺漏。如果這步工作放在head中,那麼,做與不做一個樣。
再者,現在網頁設計講究行為、結構、表現分離,比如在最近的一次改版中,我把
功能的新增函式所在的指令碼放在了head區引入,當然不能在腳本里直接呼叫這個函式來進行功能的新增,因為那個時候邊欄還沒有載入,用document.getElementById會出現找不到物件的錯誤,然後邊欄的展開與摺疊功能就沒有。
那麼,從這一點知道,功能的新增是需要在要處理的內容已經載入完成的情況下才能新增。
那什麼時候側邊欄已經載入完畢了呢,許多人自然而然地就想到了window.onload。是的,在window.onload被呼叫時,整個頁面已經載入完成,那麼邊欄也一定載入完畢,這個時候做新增onclick響應函式是肯定不會出現找不到物件的錯誤的。
- <html>
- <head>
- <metaname="author"content="www.xujiwei.cn"/>
- <metaname="description"content="ue test from xujiwei"/>
- <title>ue test1</title>
- <styletype="text/css">
- #blockHead {
- background: blue; color: white; width: 300px; padding: 1em; cursor: pointer; border: 1px solid blue;
- }
- #blockContent {
- border: 1px solid blue; width: 300px; padding: 1em;
- }
- </style>
- <scripttype="text/javascript">
- window.onload=function() {
- document.getElementById("blockHead").onclick=function() {
- if(document.getElementById("blockContent").style.display=="")
- document.getElementById("blockContent").style.display="none";
- else
- document.getElementById("blockContent").style.display="";
- }
- }
- </script>
- </head>
- <body>
- <divid="blockHead">block Head</div>
- <divid="blockContent"><imgsrc="http://www.xujiwei.cn/logo.gif"alt="hotheart"/>block Content</div>
- </body>
- </html>
如此,便給邊欄的Member模組加上了摺疊功能。但是,onload會是最好的選擇嗎?
回答是否定的,為什麼,因為window.onload只有在整個頁面完全載入完成,包括一些因為網速或者連結失效的內容也全部載入完成或者確認無效時才會被呼叫。那麼,萬一,如果這個頁面裡有某些元素由於某些原因而得不到及時的載入,就會延長整個頁面的載入時間,window.onload的執行時刻也會相應的往後移。譬如下面這段
- <html>
- <head>
- <metaname="author"content="www.xujiwei.cn"/>
- <metaname="description"content="ue test from xujiwei"/>
- <title>ue test2</title>
- <styletype="text/css">
- #blockHead {
- background: blue; color: white; width: 300px; padding: 1em; cursor: pointer; border: 1px solid blue;
- }
- #blockContent {
- border: 1px solid blue; width: 300px; padding: 1em;
- }
- </style>
- <scripttype="text/javascript">
- window.onload=function() {
- document.getElementById("blockHead").onclick=function() {
- if(document.getElementById("blockContent").style.display=="")
- document.getElementById("blockContent").style.display="none";
- else
- document.getElementById("blockContent").style.display="";
- }
- }
- </script>
- </head>
- <body>
- <divid="blockHead">block Head</div>
- <divid="blockContent"><imgsrc="http://www.xujiwei.c_n/logo.gif"alt="hotheart"/>block Content</div>
- </body>
- </html>
因為http://www.xujiwei.c_n/logo.gif中的域名是不合法的(域名中不可以包含下劃線),但是瀏覽器不會去判斷,仍舊照常去解析,然後出現不可到達的錯誤,再用圖片的替代文字來代替圖片,這需要時間。在這段時間裡,window.onload都不會執行,因為瀏覽器認為頁面還沒有載入完成,所以還不是呼叫window.onload的時候,也就是說,這個摺疊功能一直沒有新增。
但是使用者的操作不會受這一點內容的影響。在整個頁面的輪廓出來以後,使用者就會開始做自己要做的事,而不會等到瀏覽器確認那一點點的東西是不可以成功載入的,執行完window.onload才去做自己要做的事。
換句話說,就是這些功能的新增要在使用者覺得他可以做他自己要做的事之前進行,中間不能因為一些未知的原因而擱置。那麼,這些功能的新增應該放在什麼位置?我的做法是在頁面的HTML已經載入時去呼叫功能新增函式,再加上HTML語法規則,把功能新增函式的呼叫放在了body標籤結束之前,即:
- <html>
- <head>
- <metaname="author"content="www.xujiwei.cn"/>
- <metaname="description"content="ue test from xujiwei"/>
- <title>ue test3</title>
- <styletype="text/css">
- #blockHead {
- background: blue; color: white; width: 300px; padding: 1em; cursor: pointer; border: 1px solid blue;
- }
- #blockContent {
- border: 1px solid blue; width: 300px; padding: 1em;
- }
- </style>
- <scripttype="text/javascript">
- function initApp() {
- document.getElementById("blockHead").onclick=function() {
- if(document.getElementById("blockContent").style.display=="")
- document.getElementById("blockContent").style.display="none";
- else
- document.getElementById("blockContent").style.display="";
- }
- }
- </script>
- </head>
- <body>
- <divid="blockHead">block Head</div>
- <divid="blockContent"><imgsrc="http://www.xujiwei.c_n/logo.gif"alt="hotheart"/>block Content</div>
- <scripttype="text/javascript">
- initApp();
- </script>
- </body>
- </html>
這個時候,雖然瀏覽器仍然在試圖解析www.xujiwei.c_n,去下載logo.gif,但是摺疊功能已經成功添加了,使用者進行他的操作已經沒有問題,至於那張圖片是否能顯示出來,已經不會影響使用者對整個頁面的使用。
在test1中,可以看出如果整體頁面中沒有影響頁面載入的內容,那麼window.onload進行頁面功能新增也是可以的,但是現在的網頁做出來誰能保證其中的內容一直有效呢,於是在test2中可以看到如果頁面中有載入不了的內容,window.onload可能會在使用者離開頁面之後還沒有執行,就因為那麼一點內容載入不了,導致window.onload不能執行,接著就是一些功能使用者不能用,接著使用者感覺就不好,接著使用者就離開了本頁。而在test3中,沒有把功能的新增放在window.onload中,而是放在了頁面程式碼的末尾,那麼即不會在執行功能新增函式時,出現找不到物件的錯誤,也不會因為頁面一點載入不了的內容而影響功能的新增,使用者能感覺到的只是有那麼一點點內容可能因為時間或者其他一些原因失效而不能載入,但這並不影響他對整個頁面的使用。
當然,選擇在哪個地方進行頁面功能的新增是個仁者見仁,智者見智的問題。每個人的需要不同,處理方法也會相應的不同。我比較傾向於把頁面中關鍵功能的部分放在body結束標籤之前,而其他一些修飾性的功能如果給連結加上修飾性的title等放在window.onload,這樣即不會影響使用又能有較好的頁面效果。