Skip navigation.

踩 IE

I hate IE forever.

October 2005

( Monthly archive )

[转载]如何使.net开发的程序正确支持firefox等非ie浏览器

,

http://dev.codelphi.com/virushuo/archive/2004/08/27/20311.aspx

本文的完成,需要感谢adex的帮助。

用firefox去看asp.net做的网站,一般是很不爽的。所有的内容都像被风吹晕了一样往左边斜。就像这样: firefox

IE里面则是这样的: ie

以前我并没有在意过这个问题,总觉得是作页面的时候做得不好。(关于页面的知识我很bc,就算在意估计也不会有什么结果)。今天,同事Adex发现了这个 现象的原因--asp.net的服务器控件在不同的浏览器中render出来的结果是不一样的。在firefox和ie中分别是这样的:

firefox:
<table id="panLogin" cellpadding="0" cellspacing="0" border="0" width="100%">
ie:
<div id="panLogin">

这下清楚了,本来好好的div,在firefox中变成了table。怪不得无论如何都往左偏。

用Reflector反编译system.web.dll的代码,在HtmlTextWriter类中可看到如下代码:
protected virtual HtmlTextWriterTag GetTagKey(string tagName)
{
if ((tagName != null) && (tagName.Length > 0))
{
object obj1 = HtmlTextWriter._tagKeyLookupTable[tagName.ToLower(CultureInfo.InvariantCulture)];
if (obj1 != null)
{
return ((HtmlTextWriterTag) obj1);
}
}
return HtmlTextWriterTag.Unknown;
}
这段代码在其子类Html32TextWriter中被重载为
protected override string GetTagName(HtmlTextWriterTag tagKey)
{
if (tagKey == HtmlTextWriterTag.Div)
{
return "table";
}
return base.GetTagName(tagKey);
}

明显,div被替换成了table。

为什么如此呢?请看这两篇文章
http://aspnet.4guysfromrolla.com/articles/050504-1.aspx
http://slingfive.com/pages/code/browserCaps/

比较长,我就不翻译了。

简单的说,就是在machine.config里面的<browserCaps>节点,定义了一些判断useragent的表达式。其中对ie的判断是这样的:
<case match="^Mozilla[^(]*\(compatible; MSIE <snip>">
browser=IE
...
tagwriter=System.Web.UI.HtmlTextWriter
</case>
而对mozilla5/firefox呢?是这样的:
<case match="^Mozilla/5\.0 \([^)]*\) (Gecko/[-\d]+ )?Netscape6/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)).*">

首先,这段正则表达式错了,firefox和mozilla5的useragent都没有包含Netscape6。然后,这段代码也没有让他们使用 HtmlTextWriter。也就是说,mozilla5/firefox只能得到html3.2的代码。

解决的方法很简单,用这个老外写的代码就可以,不仅解决了firefox的问题,好像还能解决mac机上的问题,不过我没测试mac。代码如下:
<!-- 2003-12-03, Rob Eberhardt - http://slingfive.com/demos/browserCaps/ -->
<browserCaps>
<!-- GECKO Based Browsers (Netscape 6+, Mozilla/Firebird, ...) //-->
<case match="^Mozilla/5\.0 \([^)]*\) (Gecko/[-\d]+)? (?'type'[^/\d]*)([\d]*)/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)).*">
browser=Gecko
type=${type}
frames=true
tables=true
cookies=true
javascript=true
javaapplets=true
ecmascriptversion=1.5
w3cdomversion=1.0
css1=true
css2=true
xml=true
tagwriter=System.Web.UI.HtmlTextWriter
<case match="rv:(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*))">
version=${version}
majorversion=${major}
minorversion=${minor}
<case match="^b" with="${letters}">
beta=true
</case>
</case>
</case>

<!-- AppleWebKit Based Browsers (Safari...) //-->
<case match="AppleWebKit/(?'version'(?'major'\d)(?'minor'\d+)(?'letters'\w*))">
browser=AppleWebKit
version=${version}
majorversion=${major}
minorversion=0.${minor}
frames=true
tables=true
cookies=true
javascript=true
javaapplets=true
ecmascriptversion=1.5
w3cdomversion=1.0
css1=true
css2=true
xml=true
tagwriter=System.Web.UI.HtmlTextWriter
<case match="AppleWebKit/(?'version'(?'major'\d)(?'minor'\d+)(?'letters'\w*))( \(KHTML, like Gecko\) )?(?'type'[^/\d]*)/.*$">
type=${type}
</case>
</case>
<!-- Konqueror //-->
<case match = "Konqueror/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'));\w*(?'platform'[^\)]*)">
browser=Konqueror
version=${version}
majorversion=${major}
minorversion=${minor}
platform=${platform}
type=Konqueror
frames=true
tables=true
cookies=true
javascript=true
javaapplets=true
ecmascriptversion=1.5
w3cdomversion=1.0
css1=true
css2=true
xml=true
tagwriter=System.Web.UI.HtmlTextWriter
</case>
</browserCaps>

为了避免在每台机器上配置的麻烦,可以在项目的web.config中加入这段代码。试试看,是不是table变成div了?

题外话:这个错误有点弱智,我不太相信ms能犯这样的错误,其实我更倾向于相信这是故意的。要么就是他们真的认为除了IE,别的浏览器都不能正确的支持html4.0。殊不知,支持最差得反而是IE。

英文网站提到这个问题的很多,但中文的竟然一个没有。这是一件可怕的事情,可见中国的.net程序员眼中只有IE,没有其他浏览器。这是何等悲哀的事情。

谈谈微软、浏览器和WEB标准技术的推广问题

首先,我要说微软就是tmd的阻挠web技术发展的大毒瘤!!

为什么这么说?随着web技术的发展浏览器已经越来越不能满足需要,为了顶住Firefox的压力千呼万唤始出来的IE7居然最低支持WindowsXP SP2,其实我不应该感到奇怪,现在微软那些招牌产品的最新版本几乎都不支持win2000了,wmp,msn等等。win2000有多少用户微软不是不知道,这么做完全是只为了尽可能突出XP和Vista系统的“先进性”,逼你升级windows。要说其他产品倒也无所谓,但作为其浏览器占有率占绝对优势的开发商,微软有义务做到IE7各平台通用,不仅是为了方便用户,也是为了web技术健康正常的发展——IE5和IE6对CSS的支持实在是太落后了,BUG实在是太多了。CSS2标准制定了这么多年,到现在还有很多特性得不到广泛应用,完全是为了照顾IE这个“大爷”。现在IE7不支持2000,那么我以后写网页还是要照顾那可怜的IE6甚至IE5,很多CSS2的特性还是不敢随便使用...

所有的一切完全是为了微软自己的商业利益。或许有的朋友要笑了,人家微软本来就是商人,这么做天经地义,你作技术的别太理想化了。对,说得没错,我这篇文完全就是从一个web技术爱好者角度来写的,如果你自认眼光长远瞧不起做技术的崇尚微软商业模式的话那么你可以看到这里停止了,道不同不相为谋。

再说IE那超强的“纠错性”,IE的纠错性强到什么地步?错误拼写的标签它有时都能“正确识别”,明明是id该干的事IE可以用name来代替。对,表面上看是方便了开发者,但长期下去只会培养开发者不良的编码习惯和加大标准推广的难度。如果一个老师放任自己的学生写错字只会给高分,那么最终只会害了这个学生。也许这就是微软的最终目的,让大家都习惯他的浏览器和各种私有特性,尽可能的不让用户中途转向其他浏览器以保持它的垄断地位。

结果推广web标准的人遇到最多的呼声就是:

用了CSS我的网页在IE的不同版本下表现不一样,在其他浏览器又是一个样!太难了,我还是先不学了!

虽然有很多方法解决这些兼容性问题,但无疑这会消耗大量的时间和精力,提高了CSS的学习门槛,影响了技术的推广,一个原本很好的技术如果连推广都不力的话还谈何发展?

作为用户,我一点也不期待IE7,因为从目前公布的新特性中,IE7没有超越任何其他现代浏览器的地方,甚至某些功能稍弱。我没有理由抛弃Opera和Firefox换回IE。

作为web开发者,我稍微期待一点点,只有一点点,因为毕竟是对CSS支持多一些了。至少用XP和Vista的用户可以得到更好的浏览体验了。

说到Opera和Firefox,我也顺便写一点自己的评价,不仅是作为一个用户,还作为一个前台开发者,从技术角度来比较它们。比较版本:Opera 8.5,Firefox 1.07,只比较那些看得见摸得着的地方,类似于稳定性之类看RP的地方略过不谈。

Opera较强的:

内存占用、页面渲染速度、界面亲切度、裸体安装的功能,几乎是公认的强项,我也就懒得说明了。

Firefox较强的:

渲染页面细节表现、对CSS的正确支持、几乎无限的扩展性。

渲染页面的细节表现在表单组件的外观上比较明显,贴几张图看看:

Firefox
Firefox
Opera
Opera

然后是对CSS的正确支持,今天刚发现的Opera BUG,列表前面的点跑右边去了,最新的9也没有修正这个BUG。看图:

Firefox
Firefox
Opera
Opera
HTML代码:
<div id="container">
<h2><span><a href="#">more</a></span>大话新闻</h2>
<ul>
<li><span>[2005-9-28]</span><a href="#">标题标题标题标题标题标题标题标题标题标题标题</a></li>
<li><span>[2005-9-28]</span><a href="#">标题标题标题标题标题标题标题标题标题标题标题</a></li>
<li><span>[2005-9-28]</span><a href="#">标题标题标题标题标题标题标题标题标题标题标题</a></li>
<li><span>[2005-9-28]</span><a href="#">标题标题标题标题标题标题标题标题标题标题标题</a></li>
<li><span>[2005-9-28]</span><a href="#">标题标题标题标题标题标题标题标题标题标题标题</a></li>
<li><span>[2005-9-28]</span><a href="#">标题标题标题标题标题标题标题标题标题标题标题</a></li>
<li><span>[2005-9-28]</span><a href="#">标题标题标题标题标题标题标题标题标题标题标题</a></li>
<li><span>[2005-9-28]</span><a href="#">标题标题标题标题标题标题标题标题标题标题标题</a></li>
<li><span>[2005-9-28]</span><a href="#">标题标题标题标题标题标题标题标题标题标题标题</a></li>
<li><span>[2005-9-28]</span><a href="#">标题标题标题标题标题标题标题标题标题标题标题</a></li>
</ul>
</div>
CSS代码:
#container ul {
border: 1px dotted #000;
border-top: 0;
padding: 12px 20px;
list-style: square;
color: #5B5BA7;
margin-bottom: 12px;
}
#container ul a:hover { color: #0C4B2C; }
#container ul span {
color: #646464;
float: right;
}

扩展性就不用说了,大家都清楚。

我现在是主要用Opera的,因为快,毕竟上网主要还是看字,“快”就是王道。

当然我也非常喜欢Firefox,我认为它的发展潜力是无限的,有这么多fans的支持,又是开源项目,相信过不了太久一定会解决资源占用问题。

最重要的是,没有Firefox就没有IE7的开发计划,Opera也不会成为免费软件,它对浏览器发展做出的贡献是看得见摸得着的。也许它现在还有这样那样的不足,但如果要我在3大浏览器选一个最终的胜利者,我会选Firefox(好吧,我承认我是在YY,IE的捆绑是无敌的-v-)。

October 2005
S M T W T F S
September 2005November 2005
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31