天馬行空

          There Can Be Miracles WHEN YOU BELIEVE

          統計

          最新評論

          這些天做一個網頁,發現了js和css一些有趣的問題。

          這些天做一個網頁,發現了js和css一些有趣的問題。
          1.不同的標準,不同的效果
          首先是css,原來一直用ie7和ff的瀏覽器,網頁的效果也一直和想象中一樣。然而新裝系統后,ie的版本降為6的時候,問題出現了。
          在網頁中一個div元素的css如下:
          .i-top-3btn-1{
          background-color:#e8f2fc;
          }
          ­
          .i-top-3btn-1:hover{
          background-color:#990000;
          }
          ­
          這兩個類可以控制這個層在鼠標經過時顯示不同的背景色,要達到這個效果當然也可以用js在div上做事件來實現,但是使用css中的偽類“:hover”則減輕了不少的編碼量,也讓代碼看起來很清秀。
          ­
          這個“:hover”偽類,在ie7和ff下正常的表現出了鼠標經過變化底色的效果,而在ie6下卻沒有反應。經過一番資料查找,才發現,ie7和ff實現的是css2標準,而ie6只實現了一部分的css1標準。
          ­
          在css1中,偽類“:hover”只有“a”標記才能正確表現。而其他標記都不支持“:hover”偽類。在css2中,所有的標記都開始支持“:hover”這個偽類了。
          ­
          我的項目中,div里本來就應該是一個鏈接,所以加上“a”標記并不會對我的布局以及效果產生太大的影響,然而如果只是淡出的想讓div或其它元素產生背景色變化的話,最好的解決方法可能還是在元素上做事件吧。
          ­
          2.for的陷阱
          早在看js面向對象方式編程的一些書籍的時候,就看到了這樣的寫法:
          ­
          for(var i in obj){
                  alert(i);
          }
          ­
          通過這樣的方法,可以準確的獲知對象obj的所有成員的名稱。這也被稱之為js的反射機制。
          ­
          而這次做項目的時候由于在頁面加載時要同時執行大量的函數,所以按照ajax in action 一書中的建議,使用Observer模式變現啟動加載的代碼:
          ­
          //首先聲明一個數組型變量,把要在啟動時加載的函數全部存春在這個數組中。
                  var __SYS_Startup_Funcs = new Array();
                  
          //提供一個方法,讓程序員可以把要在啟動時加載的函數存放到先前聲明的數組里。
                  function registerStartup(pFunction){
                      __SYS_Startup_Funcs.push(pFunction);
                  }
          ­
          //替換系統的onload函數以達到加載啟動的目的。
                  window.onload = function (){
                     for(var i in __SYS_Startup_Funcs){
                          i.call();
                      }
                  }
                  
          紅色的這段代碼是郁悶我很久的根源,按照常理,每次循環就從“__SYS_Startup_Funcs”中取出一個函數,并調用這個函數的call方法來執行它。
          但是在執行時發生錯誤:“對象不支持此方法或屬性”。
          ­
          這是人很迷惑,因為call方法是屬于Function這個對象的,而每一個函數都是繼承自Function的。為什么產生這樣的錯誤呢?
          ­
          于是開始排錯,首先用alert(i)來打印。對話框中顯示的正好是我傳進去的函數名。于是換另外一種方式alert(typeof(i))來打印。對話框中顯示的是“string”。
          這次的結果出乎我意料,但是卻直接指出了這段代碼的錯誤所在。
          ­
          在查閱資料后,見到這樣一段話:
          ­
          Javascript 提供了一種特別的循環方式來遍歷一個對象的所有用戶定義的屬性或者一個數組的所有元素。for...in 循環中的循環計數器 是一個字符串,而 不是數字 。它包含了當前屬性的名稱或者表示當前數組元素的下標。
          ­
          根據這個特性,我們取出來的并不是集合中的一個元素,而是這個元素的名字!
          ­
          這樣的錯誤顯然是受了c#和java這樣面向對象語言的影響。

          posted on 2007-11-29 16:11 Fenris 閱讀(303) 評論(0)  編輯  收藏 所屬分類: 有關前臺

          主站蜘蛛池模板: 涞源县| 葫芦岛市| 泰安市| 光泽县| 阳信县| 西平县| 城口县| 宝山区| 麦盖提县| 泉州市| 永德县| 烟台市| 沂水县| 萨迦县| 丰顺县| 大邑县| 灵寿县| 迁西县| 永吉县| 西盟| 新晃| 滨海县| 涞源县| 平利县| 深水埗区| 承德市| 依兰县| 策勒县| 申扎县| 马山县| 康平县| 黔西| 犍为县| 临城县| 理塘县| 武夷山市| 玉树县| 林甸县| 定结县| 苗栗县| 理塘县|