css expression 使用javascript 方法...
时间:2010-08-07 来源:lin49940
由于 IE6 不支持css first-child 伪类, 所以试着通过 css 的 expression 来解决, 当然 css 的 expression 是不能在 FireFox 执行的, 所以基本上都是两种都写, 并且是写在一起.
下面是一个把id为mytable 的表格的第一列隐藏的例子.
<SCRIPT LANGUAGE="javascript" type="text/javascript">
   function get_previoussibling(n) 
   { 
     var x=n.previousSibling;
     if(x == null) return null;
     while (x && x.nodeType!=1) 
      { 
        x=x.previousSibling;
      } 
     return x; 
   } 
  </SCRIPT>  
<style>
  /*------- 这个是针对IE6的 ---------*/
   table#mytable tbody tr td{
        display: expression(function(el){
                                              el.style.display = (get_previoussibling(el)?'inline':'none');
                                       }(this) );
   }
/*------- 这个是针对 FireFox 的 -------*/
   table#mytable tbody tr td:first-child{
    display:none;
   }
  </style>
我上面的例子有点乱, 看看下面的语法(自己乱写的, 没参考资料, 如果写错, 请高手提醒, by lin49940)
   td{
    display: expression(function1[,function2[,...........]])
}
function1, function2 是自定义的 JS 方法, 有多个function 就加多个function, 他们中间用逗号 "," 隔开, 顺序执行.
如
<script>
function foo1(){//里面的代码至少要设置对应的属性}
function foo2(){}
</script>
   td{
    display: expression(foo1(),foo2());
}
如果你不想执行 foo2(), 那就
   td{
    display: expression(foo1());
}
当然如果你不想把 function 写在 <script> 里面, 可以直接
   td{
    display: expression(
                            function(el){
                                 el.style.display = (get_previoussibling(el)?'inline':'none');
                            }(this) );
   }
function(el){}(this): 其实就是类似
  function foo(str){
        alert(str);
  }
  var fooDemo = foo;
  fooDemo("hello world");
以上是个人理解, 当然你不止可以传this了, 你有其他参数也可以传的.
其实, 很多人都注意到了css 的 expression 可以会多次执行, 并且耗内存多, 耗内存这个是确定的, 但是多次执行是可能是代码的问题了.
如, 我是要设置 display 属性, 如果我的代码没有 el.style.display = XXXX,
或者我写做 someFunction()?(el.style.display = XXXX):(el.style.display = YYYY), 那我很抱歉的通知您, 你的页面等着假死吧, 在你点鼠标, 滑滚轮的时候, 会有不断的 expression 执行, 几千条, 几万条, 甚至更多, 看看你的内存吧.
所以, 在你的代码中, 所有操作集中在一个 function 里面, 最后只需要 el.style.display = someFunction().
这里附带一段检查 expression 执行次数的代码, 参考自:
http://stevesouders.com/hpws/onetime-expressions.php
  <table border=0 cellpadding=0 cellspacing=0>
    <tr>
      <td valign=middle>Expression 执行次数:
        <input type=text size=10 id=cntrdisp disabled>
      </td>
    </tr>
  </table>
  <script>
  var gnExpr = 0;
  var gCntrDisplay;
  var gbOn = true;
  function setOnetimeBgcolor(elem) {
      elem.style.display = (elem.previousSibling?'inline':'none');
      //elem.style.backgroundColor = ( (new Date()).getHours()%2 ? "#F08A00" : "#B8D4FF" );
  }
  function setCntr() {
      gnExpr++;
      if ( gbOn ) {
   displayCntr();
      }
      return true;
  }
  function displayCntr() {
      if ( ! gCntrDisplay ) {
   gCntrDisplay = document.getElementById("cntrdisp");
      }
      if ( gCntrDisplay ) {
   gCntrDisplay.value = gnExpr;
      }
  }
  function setDisplay(bOn) {
      gbOn = bOn;
  }
</script>
  <style>
   td{
         display: expression( setCntr(), setOnetimeBgcolor(this) );
   }
</script>
搞定, 收工










