破网录

Firefox大战IEnet

导航

Blog统计

文章

收藏

相册

相关链接

存档


正在读取评论……

2005年01月


Firefox以及其他Gecko引擎的浏览器遇到的最常见的兼容性问题是IE DHTML和W3C DOM的区别。
不规范的DHTML脚本中最容易犯的一个错误就是使用不规范的方式来访问网页元素。我们曾经用spider爬一些国内著名门户网站,单从数量上看,95%以上的javascript错误都来自于此。
常见的访问网页元素的不规范方式有一下几种:
  1. 直接用id或name属性名访问网页元素,例如:
    <div id="icefable1">...</div>
    <script language="javascript">
    icefable1.style.width=0;
    </script>
  2. 正确的做法是使用getElementById来得到某个有id属性的元素,用getElementsByName来得到某些有name属性的元素。例如上面的代码可以改成:
    <div id="icefable1">...</div>
    <script language="javascript">
    document.getElementById("icefable1").style.width=0;
    </script>

  3. 在网页种加入相同id的网页元素。例如:
  4. <td width="33%" class=tab-on id=navcell onmouseover=switchCell(0)><div align="center">重要提示</div></td>
    <td width="33%" class=tab-off id=navcell onmouseover=switchCell(1)><div align="center">学术活动</div></td>
    <td width="34%" class=tab-off id=navcell onmouseover=switchCell(2)><div align="center">交大热点</div></td>
    ...
    <script language="javascript">
    ...
    navcell[n].className="tab-on";
    ...
    </script>
    HTML标准中规定id在网页中必须是唯一的.如果你要一次访问一组元素,对于支持name属性的元素,你可以使用name属性,name可以是不唯一的。上面的例子可以改为:
    <td width="33%" class=tab-on name="navcell1" onmouseover=switchCell(0)><div align="center">重要提示</div></td>
    <td width="33%" class=tab-off name="navcell2" onmouseover=switchCell(1)><div align="center">学术活动</div></td>
    <td width="34%" class=tab-off name="navcell3" onmouseover=switchCell(2)><div align="center">交大热点</div></td>
    ...
    <script language="javascript">
    ...
    eval('document.getElementById("navcell'+n+'").className="tab-on"');
    ...
    </script>
    有人写了快一辈子DHTML了还搞不清楚id和name到底有什么区别,就是因为IE从来没有帮他们搞清楚过。你感谢IE的“兼容性”么?我不。
  5. 使用all属性,如document.all,来访问网页元素。all属性是一个IE DHTML 专有的属性,可以通过如下方式来访问网页元素:
  6. <HTMLelement>.all.<id或name>
    <HTMLelement>.all("<id或name>")
    <HTMLelement>.all["<id或name>"]
    规范的做法是使用getElementById或getElementsByName。



让我们试想一下一种互联网的状态,网站因提供有用信息而受到长期的或者大量的关注,而这些站点提供的链接也会受到更多关注。无论从用户的角度还是搜索引擎的角度,这都是一种理想的状态,大家可以因此得到所需的信息,搜索引擎可以得到准确的page rank。
而现在情况有些变化,一些网站提供了让别人在它们的页面上添加链接的功能,比如blog可以留言。垃圾链接突然蜂拥而至,网络理想状态被破坏,搜索引擎的page rank算法受到冲击。这时候google想出了一个"nofollow"的办法,看上去能解决一些问题,但真的是这样么?
现在有两个问题,一个是普通用户的,他们的weblog里总有人发布垃圾信息,另一个问题是google的,weblog中垃圾信息中的链接影响了其搜索引擎算法的准确性。
如果把在google中排名升高当作在weblog comments里发垃圾信息的主要目的,上面说的两个问题或许可以最大程度的对等起来。但实际上并非如此。page rank只是部分spammer的目的,甚至可以说,对于大部分spammer来说,这只是一个他们在发垃圾信息时无意中得到的附加好处,就算没了这个好 处,也不太会阻止他们发送垃圾信息。email spam从不会增加page rank,有人因此放弃email spam了么?
使用nofollow只能从根源上解决google的问题,他们的page rank在spammer想出新点子之前能清净一阵了。对于普通用户呢?他们因此能得到纯洁的comments?基本上不太可能。
同时nofollow技术可能带来更大的麻烦。如果nofollow被各个网站和搜索引擎接受,那么它很快就会被应用于非spam链接上。原来我在我的page上提供你的链接,就是为你的page rank做了贡献,现在我有的选择了,我可以在所有的链接上加上nofollow,想让我去掉么?给钱吧。”卖链接“很快就会成为象”卖广告”一样的生财之道。互联网的理想状态再次被破坏,搜索引擎的page rank更容易被利用了。那怪谁,谁让你下放权利了?下次再搞出一个realnofollow来么?
如果说提供留下链接的机会是为spammer开启了通向邪恶的一扇大门的话,那么提供让链接在搜索引擎中无效的方法无疑是开启了另一扇。有人说反对nofollow是技术理想主义,那么赞成nofollow同样也理想主义的厉害。



Firefox浏览网站出问题,绝大部分是网页上的非标准元素引起的,但也有例外。
前两天帮一个网友看了个问题,他有一个图片发布网站,IE能发图片,Firefox却不能。从网页上看,完全没有错误,可总是得到"图片类型不支持“的结果。最后问他要到了服务器端处理POST的那段php代码,才找到答案。
对于Progressive-JPEG,IE在POST的时候使用了image/pjpeg这个不标准的content type,而Firefox使用的是image/jpeg。他的php里只对image/pjpeg做了处理,导致了Firefox总是提交失败。
这个问题让我联想到了网易163邮箱不能贴附件的问题,从网页代码部分同样也看不出什么原因,会不会也是由Firefox和IE在POST/GET上的差别导致的?我无法求证了,除非网易也愿意把他们的代码发给我看。



mozilla.org在加入一个非标准功能的时候,第一个考虑的问题往往是--这个功能是不是在网上应用的很广泛,是不是已经变成了一个实际标准。jscript.encode是一个基本上没有人用的技术,不属于实际标准。bug在bugzilla上挂了好几年了,没什么人理。别说bug没人理,你贴个补丁上去,也不会有什么人感兴趣。
在国内,我所知道的只有BTChina使用了这个技术,Firefox浏览不了BTChina几乎成了被抱怨最多的问题之一,也是很多用户认识Madfox的一个主要原因。
对于这种非标准属性的支持,其实是一个很无可奈何的事情。首先它不是一个有用的技术,网页开发者希望通过这个技术保护的内容可以通过非常简单的反向工程破译。这注定了这种技术不会被广泛使用。而个别热门网站使用了这个技术,会一下把浏览器推到一个“支持还是不支持”的尴尬选择中。不支持吧,很多人因此放弃你了;支持吧,如果哪天BTChina良心发现,不再使用jscript.encode,对这个功能的实现马上就变成了一堆无用的垃圾代码,除了继续占用你内存中的几个字节外毫无用处。




pconlin是我见到过的非intranet的大网站中最依赖于xml data island的一个。一般来说一个大网站在选择建站技术的时候都不会选择一种专有技术,尤其比较底层的技术更是如此。看得出来,pconline在Firefox出现以后做了一些工作,使得他们的网页能在Firefox中正常显示,比如通过放弃使用overflow-x/overflow-y来解决文字重叠的问题。但是,要想从根本上放弃xml data island就没有这么简单了。
pconline最依赖于xml data island的地方是他们的下载版块,在Firefox中只能出来一些无内容的框架。但相对来说,这一部分修改的难度不大。如果想先对付一下,可以参照mozilla.org上的这篇文档,通过css/style隐藏xml数据块,然后用DOM来访问数据内容。这样改修改量很小,要注意的问题就是要使用W3C DOM,"text"属性对应的W3C属性名是"textContent",selectSingleNode这个微软函数可以通过XPath中的evaluate函数来模拟。Madfox就是这样通过XBL技术实现了对这部分网页的支持,具体的方法可以参见Madfox的代码。
另外一部分是网友评论,这部分的影响不是很大,了不起不看评论了,主要内容还是看得见的。但是这部分想要让Firefox看到反而不太容易,因为这里使用了xml data island中的data binding技术。使用这个技术,就不仅仅是数据访问的问题,连html中一些tag的结构和渲染行为都发生了变化。我觉得比较好的修改方式是采用server端的技术对这段xml data进行预先处理,生成html片断后填写到网页中。或者干脆使用XSLT或者XHTML,当然,这样的修改相对就比较大了。
xml data island是一个没有前途的技术,这种将不同markup language不加区别的混合的丑陋设计注定了它不会成为一个标准而被广泛支持。污染名字空间,增加xml解释器的复杂度,这些都使得它与各种被广泛使用的xml技术格格不入。相信微软自己也不会在互联网应用方面对这个技术再做更多的改进,被彻底淘汰只是时间问题。



Firefox的中国用户问的最多的一个问题可能就是“为什么我们不能登录XX银行了?”。原因很简单,这些只能通过IE登录的网上银行都使用了ActiveX这个微软专有的技术,它们上的不是互联网而是IE网,将所有非IE和非Windows平台的用户挡在了门外。
工商银行对此有一个解释,说明它们采用ActiveX是为了安全,防止钩子程序监听键盘事件,窃听密码。保证安全并没有错误,关键是选错了方式。
并不是说activex毫无用处,但是对于一个互联网应用, activex并不适合。讲大道理,互联网的本质是可以让不同的人(正常人和残废人)使用不同的平台(不同的硬件平台,甚至手持设备)用不同的软件(不同的操作 系统,浏览器和其他互联网程序)来互相交流信息。activex的使用破坏了这个基础,不仅如此,网络应用对特定系统依赖,破坏了Decentralization的原则。这样,当这个特定的设备和平台发生安全性问题的时候,这个平 台的安全性问题就很有可能转嫁到了你的具体应用上,且无法在短时间内找到替换。 不把所有的鸡蛋放在一个篮子里是考虑安全问题时的一个很基本的出发点。在互联网应用中使用activex就等于逼迫大家把所有的鸡蛋放在一个篮子里,别无选择。就好象在食物链中种群越少。ActiveX在这里似乎解决了一个问题,但实际上带来的安全隐患远大于其表面上解决的问题。Activex在 互联网应用中从来就不是也不可能是一个好的解决方案。
跨平台跨浏览器的方案不是没有,plug-in就是一个很好的选择。跨平台的浏览器Firefox、Mozilla、Opera以及Apple Mac OS X上的Safari都使用的是相同的plugin接口(NPAPI),Flash、Realplay、Acroread都采用这个接口开发出了各种平台上不依赖于特定浏览器的plugin。要达到相同的功能,实现上也没有什么难度。
登录网上银行是IE留在我机器上的最后一个理由 ,也是我的小飞唯一不能为我做的事情了。



今天在论坛上看到这样一个帖子

分别用IE和Firefox浏览 http://mylove.163.com/news.htm?name=yookee&gender=%u7537 不管它是否遵循了w3c标准,但是网络的娱乐性应该用标准来约束吗?对于普通用户来说他只在乎得到了什么,至于用什么浏览器,浏览器又使用什么技术,技术又遵循什么标准,对他们来说应该是黑盒子或是完全透明的(如若无物),否则我们就陷入了为技术而技术的尴尬。
想起当年在bugzilla上和Brendan Eich争论IE兼容性问题,我妄图通过某种手段向普通用户灌输W3C标准,他老人家说了一段话:

------- Additional Comment #38 From Brendan Eich 2004-02-26 00:11 PST [reply] -------
> Do you mean the evangelism work should only be done to the website developers?
> Then I think you might just miss the real power that pushes the web world.

This makes no sense. Most end users have no clue about what is web standard and
what is not. Trying to get them to learn is like trying to teach a pig to sing
-- it does you no good and it annoys the pig.
看来此言不虚。



主要想写:
  1. 什么网站用了什么非标准特性导致非IE浏览器无法浏览
  2. 用什么标准技术或者其他技术可以使得非IE浏览器得到同样的效果
  3. 嗯,或许还可以写写什么网站迷途知返,改邪归正了.