Asp.Net的DataGrid与GridView控件确实强大,尤其是被专注于呈现数据时。而当你需要拥有完整的增删改差功能的DataGrid时,也不是什么难事,但如果你的客户需要一种无刷新页面的实现呢?
我就碰到了这个问题,因为客户的下属公司访问总部的网络时常不稳定,每次对服务端方法的访问都是带有不小的网络传输开销。以至于,利用DataGird实现的增删改差功能,每次刷新页面都会明显地顿一下。这是客户无法忍受的.......
或许这个时候,你会质疑:为什么不将这些功能分拆成几个页面来做呢?明显效率和实现难度会大大减少。我只能说一句,任何设计都会在客户的需求面前碰到难题。而这些也不是本文所讨论的话题。
不妨做这样一个实验,新建一个文本文档,后缀名改为.html。然后输入以下代码:
<html>
<script>
function setTextFocus()
{
var t1 = document.getElementById('panel');
t1.innerHTML = "<input type='text' id='text1' /><input type='text' id='text2' />";
setTimeout(function(){
t1.children[1].focus();
}, 0);
t1.children[0].focus();
}
</script>
<body onload="setTextFocus()">
<p id="panel"></p>
</body>
</html>
保存后,双击该页面,会发现实际获得焦点的是后面那个文本框,也就是说"t1.children[0].focus();"没有起到应有的作用。而这个页面用FF打开,反应正常,第一个框获得了焦点。我在这个地方郁闷了很久,差点就要妥协了,跟客户交待,这个要求无法实现.......
后来找到一篇比较拉风的帖子,javaeye上的,貌似发帖者是个标题党呢?
【西方人通常发现不了的bug】http://www.javaeye.com/topic/191555
【《认识延迟时间为 0 的 setTimeout》】http://realazy.org/blog/2008/03/29/understand-0-settimeout/#comment-63839
原因就不在描述了,两篇帖子已经能为你解惑了。
总结:当你在百思不得其解你的JS到底在哪里出错时,就尝试在某些操作外套一个setTimeOut函数吧,IE的BUG真的不少呢。