2008-04-02
IE让人啼笑皆非的bug: 用cell的序号,找不到cell.
先不废话 代码如下:
运行后
ie里提示 tr1 td2
ff safari opera下都提示 tr1 和 td3
---------------------------------
总结: 也就是说 在IE里 ,当table中有隐藏的td时 , cellIndex这个属性不再可靠.
但是 当table中有隐藏的tr时 , rowIndex这个属性依然是可靠的.
ie里对 td 隐藏后的 ,在计算 cellIndex时 会当作那个隐藏的td被移除了一样计算
但是 tr的cells集合内却并没有移除那个隐藏的td.
IE的做法实在是 让人无语了
<html>
<head>
<script type="text/javascript" >
function init(){
var tab0=document.getElementById('tab0');
var tr1=document.getElementById('tr1');
var td3=document.getElementById('td3');
var idx_tr1=tr1.rowIndex;
var idx3= td3.cellIndex;
alert( tab0.tBodies[0].rows[idx_tr1].id + '\n'+ tr1.cells[idx3].id );
}
</script>
</head>
<body onload="init()">
<table id="tab0" border="1" width="300">
<tr id="tr0" style="display:none;"><td>.</td><td>.</td><td>.</td><td>.</td><td>.</td></tr>
<tr id="tr1">
<td id="td0">0</td>
<td id="td1">1</td>
<td id="td2" style="display:none;">2</td>
<td id="td3">3</td>
<td id="td4">4</td>
</tr>
</table>
</body>
</html>
运行后
ie里提示 tr1 td2
ff safari opera下都提示 tr1 和 td3
---------------------------------
总结: 也就是说 在IE里 ,当table中有隐藏的td时 , cellIndex这个属性不再可靠.
但是 当table中有隐藏的tr时 , rowIndex这个属性依然是可靠的.
ie里对 td 隐藏后的 ,在计算 cellIndex时 会当作那个隐藏的td被移除了一样计算
但是 tr的cells集合内却并没有移除那个隐藏的td.
IE的做法实在是 让人无语了


评论
http://support.microsoft.com/kb/814506
似乎ms并不认为这是一个bug
ms同时提供了一个他们的解决方案:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main Count Hidden Table Cells
ray_linn 的 ie注册表里是不是正好有这项啊??
你确定是运行我主贴里的代码后 在IE提示的也是 tr1 和 td3 ?
那就奇怪了
你能不能说一下你的ie版本
因为这个bug已经在几十台机器上测试过 ,确实存在了.
我最初是在webfx的sortable table的脚本里面遇到的,然后他们也采用了和你类似的方法进行了修复:
this.sort(SortableTable.msie ? SortableTable.getCellIndex(el) : el.cellIndex); // IE returns wrong cellIndex when columns are hidden SortableTable.getCellIndex = function (oTd) { var cells = oTd.parentNode.childNodes var l = cells.length; var i; for (i = 0; cells[i] != oTd && i < l; i++) ; return i; };没有想到IE现在还是有这个bug
getCellIndex : function(td){ if (GT.isIE){ var cells=td.parentNode.cells; for (var i=0,j=cells.length;i<j;i++ ){ if (cells[i]===td){ return i; } } } return td.cellIndex; },