当前位置: 代码迷 >> Web前端 >> tr 的显示隐藏display属性导致firefox 的td colspan有关问题(ZT)
  详细解决方案

tr 的显示隐藏display属性导致firefox 的td colspan有关问题(ZT)

热度:418   发布时间:2012-11-25 11:44:31.0
tr 的显示隐藏display属性导致firefox 的td colspan问题(ZT)
不知道你有没有做过这样的一种效果,一个table中的一个连接,javascript 控制 tr 的显示隐藏,来达到显示更多数据的效果。如果没做过,尝试一下吧,你会发现,table中隐藏的tr的含有colspan的td 在再次显示以后,firefox会把内容合并到 第一个td里。

有点绕,把下面的代码copy以后另存为.html 打开 就知道我说的是什么问题了。锻炼自己的动手能力,我就不贴图了,想知道原因跟解决办法就看下去吧。
01	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
02	<html xmlns="http://www.w3.org/1999/xhtml">
03	<head>
04	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
05	<title>tr 的显示隐藏display属性导致td colspan问题--imouou.com</title>
06	<link href="" type="text/css" rel="stylesheet" ></link>
07	<style>
08	    #table {width:80%;border:1px solid #ccc;border-collapse:collapse;}
09	    #table td{border-right:1px solid #ccc;border-bottom:1px solid #ccc;}
10	</style>
11	 
12	</head>
13	 
14	 <body>
15	  <table id="table">
16	    <tr>
17	        <td>1</td>
18	        <td>2</td>
19	        <td>3</td>
20	        <td>4</td>
21	        <td>5</td>
22	        <td><a href="#" id="view" class="view">查看</a></td>
23	    </tr>
24	    <tr id="dis">
25	        <td>1</td>
26	        <td colspan="6">这里的信息默认是合并了6列的效果,</td>
27	    </tr>
28	    <tr>
29	        <td>1</td>
30	        <td>2</td>
31	        <td>3</td>
32	        <td>4</td>
33	        <td>5</td>
34	        <td><a href="#" id="view" class="view">查看</a></td>
35	    </tr>
36	    <tr id="dis2" style="display:block;">
37	        <td>第一个td</td>
38	        <td colspan="6">当display等于 block 或者 inline 以后,这里在firefox的效果会变成跟 “第一个td” 在一起,然后这里为空</td>
39	    </tr>
40	  </table>
41	 </body>
42	</html>

通过 class 为view的链接,显示隐藏 id 为 dis 的tr ,当tr的属性为 display:block 或者 display:inline 的时候,firefox就会出现显示错误了。 这个究竟是什么原因引起的?我用jquery的 show();hide();来控制显示时,就没有这个问题。看了jquery1.3.2的第3785行show() 函数,里面除了设置它的display属性以外,还多了一个elem.remove();不知道是不是跟这个有关。
01	if ( elemdisplay[ tagName ] ) {
02	    display = elemdisplay[ tagName ];
03	} else {
04	    var elem = jQuery("<" + tagName + " />").appendTo("body");
05	 
06	    display = elem.css("display");
07	    if ( display === "none" )
08	        display = "block";
09	 
10	        elem.remove();
11	 
12	    elemdisplay[ tagName ] = display;
13	}

是table的块元素引起的吗?那怎么inline了以后也会?后来查到csdn有篇文章,好像是firefox的display:block有缓存,那是不是跟上面的elem.remove()也是一样的?display:”没有参数的时候,默认是显示元素,我把应该显示的 display:block 改为 display:” ;解决了firefox的colspan这个问题。但是为什么会这样,还是一知半解,你知道吗?

jquery的demo
01	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
02	<html xmlns="http://www.w3.org/1999/xhtml">
03	<head>
04	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
05	<title>tr 的显示隐藏display属性导致td colspan问题--imouou.com</title>
06	<link href="" type="text/css" rel="stylesheet" ></link>
07	<style>
08	    #table {width:80%;border:1px solid #ccc;border-collapse:collapse;}
09	    #table td{border-right:1px solid #ccc;border-bottom:1px solid #ccc;}
10	</style>
11	<script src="http://www.imouou.com/js/jquery.js" type="text/Javascript" ></script>
12	 
13	<script>
14	    $(function(){
15	         $("#view").toggle(function(){
16	            $("#dis").show();
17	         },function(){
18	            $("#dis").hide();
19	         })
20	    })
21	</script>
22	</head>
23	 
24	 <body>
25	  <table id="table">
26	    <tr>
27	        <td>1</td>
28	        <td>2</td>
29	        <td>3</td>
30	        <td>4</td>
31	        <td>5</td>
32	        <td><a href="#" id="view" class="view">查看</a></td>
33	    </tr>
34	    <tr id="dis" style="display:none;">
35	        <td>1</td>
36	        <td colspan="6">这里的信息默认是合并了6列的效果,当display等于 block 或者 inline 以后,这里在firefox的效果会变成跟 1 在一起,然后这里为空</td>
37	    </tr>
38	  </table>
39	 </body>
40	</html>
1 楼 zhaoxiu_1945 2011-11-03  
。。。 你现在知道什么原因了吗,我按照你的方法解决了问题,但是这是问什么啊
2 楼 SunsetGrace1 2012-03-13  
我也遇到了,解决方法如下
var display=$('#'+attendlistid).attr('class');
               
                if(display=="hidden"){
                    $('#'+attendlistid).show();
                    $('#'+attendlistid).removeClass(display).addClass("show");//已失效,起作用的只是show(),只是作为显示隐藏的条件判断用,为了FF下clospan合并为1个单元格的问题
                    $('#attendbtn_'+courseid).val('<%=user.get("ht.university.attendlistbtnhide")%>');
                }else{
                    $('#'+attendlistid).hide();
                    $('#'+attendlistid).removeClass(display).addClass("hidden");
                    $('#attendbtn_'+courseid).val('<%=user.get("ht.university.attendlistbtn")%>');
                }
3 楼 SunsetGrace1 2012-03-13  
SunsetGrace1 写道
我也遇到了,解决方法如下
var display=$('#'+attendlistid).attr('class');
   if(display=="hidden"){
      $('#'+attendlistid).show();
      $('#'+attendlistid).removeClass(display).addClass("show");//已失效,起作用的只是show(),只是作为显示隐藏的条件判断用,为了FF下clospan合并为1个单元格的问题
    }else{
      $('#'+attendlistid).hide();
      $('#'+attendlistid).removeClass(display).addClass("hidden");
    }

  相关解决方案