最近一个同事使用 asp.net 2.0 的Menu控件, 这个控件是asp.net 2.0 导航控件中的一个. 最近发现了一个问题, 把这个控件放在masterpage中. 然后一个页面使用该masterpage.
发现当页面加载没有结束,迅速点击 菜单的时候.会报一个IE特有的错误.呵呵.
Google 一下的,这个错误非常多. 也有人用asp.net menu的时候碰到类似的错误.比如:
http://forums.asp.net/thread/1158791.aspx
http://forums.asp.net/thread/1159962.aspx
类似的程序用firefox 浏览却没有问题. IE这个问题其实是一个很常见的错误,它一般会在document还没有加载结束, 有脚本动态的修改document状态的时候发生.
对于asp.net menu 我看了一下它自动生成的代码. asp.net 会动态的生成几个axd文件,其实就是js文件. 其中有类似的代码.
呵呵,果然有一个动态的appendchild的代码. 其实这个做法很不严谨, MS 写的代码, 有时候也会忽略一些问题.
万一document 还没有加载, appendchild 触发了怎么办?
呵呵,当我点的很快的时候, 正好是这个并发的场合. 类似线程同步一样. 这也是为什么IE会报错的员应. firefox对document的状态修改并发控制可能跟ie不一样.
接下来怎么修改呢?
1. 可以用把menu放到一个div中,首先设置visibility为hidden.
2. 等document 加载完之后,再设置visibility为visible.
这样就可以搞定了.
如果可以修改script的话,给script加上一个Defer属性也可以解决.
发现当页面加载没有结束,迅速点击 菜单的时候.会报一个IE特有的错误.呵呵.
Google 一下的,这个错误非常多. 也有人用asp.net menu的时候碰到类似的错误.比如:
http://forums.asp.net/thread/1158791.aspx
http://forums.asp.net/thread/1159962.aspx
类似的程序用firefox 浏览却没有问题. IE这个问题其实是一个很常见的错误,它一般会在document还没有加载结束, 有脚本动态的修改document状态的时候发生.
对于asp.net menu 我看了一下它自动生成的代码. asp.net 会动态的生成几个axd文件,其实就是js文件. 其中有类似的代码.
if (!childFrame) {
childFrame = document.createElement("iframe");
childFrame.id = childFrameId;
childFrame.src = (data.iframeUrl ? data.iframeUrl : "about:blank");
childFrame.style.position = "absolute";
childFrame.style.display = "none";
childFrame.scrolling = "no";
childFrame.frameBorder = "0";
if (parent.tagName.toLowerCase() == "html") {
document.body.appendChild(childFrame);
}
else {
parent.appendChild(childFrame);
}
}
childFrame = document.createElement("iframe");
childFrame.id = childFrameId;
childFrame.src = (data.iframeUrl ? data.iframeUrl : "about:blank");
childFrame.style.position = "absolute";
childFrame.style.display = "none";
childFrame.scrolling = "no";
childFrame.frameBorder = "0";
if (parent.tagName.toLowerCase() == "html") {
document.body.appendChild(childFrame);
}
else {
parent.appendChild(childFrame);
}
}
呵呵,果然有一个动态的appendchild的代码. 其实这个做法很不严谨, MS 写的代码, 有时候也会忽略一些问题.
万一document 还没有加载, appendchild 触发了怎么办?
呵呵,当我点的很快的时候, 正好是这个并发的场合. 类似线程同步一样. 这也是为什么IE会报错的员应. firefox对document的状态修改并发控制可能跟ie不一样.
接下来怎么修改呢?
1. 可以用把menu放到一个div中,首先设置visibility为hidden.
2. 等document 加载完之后,再设置visibility为visible.
document.onreadystatechange=ShowMenu;
function ShowMenu()
{
if(document.readyState=="complete")
{
document.getElementById("DivOfMenu").style.visibility="visible"
}
}
function ShowMenu()
{
if(document.readyState=="complete")
{
document.getElementById("DivOfMenu").style.visibility="visible"
}
}
这样就可以搞定了.
如果可以修改script的话,给script加上一个Defer属性也可以解决.