是否可以编写一个使所有浏览器符合标准的JavaScript库?

时间:2009-10-02 21:09:47

标签: javascript css dom standards

我不是JavaScript专家,但可以创建一个可嵌入的JavaScript文件,使所有浏览器标准兼容吗?就像所有已知的JavaScript黑客集合一样,它们强制每个浏览器正确地解释代码?

例如,除了链接之外,IE6无法识别CSS中的:hover伪类,但是存在一个JavaScript文件,它找到对:hover的所有引用并应用强制IE6的hack做得对,允许我按我的意愿使用悬停命令。

每个网站管理员都需要花费大量时间(以及金钱)来学习所有这些黑客。想象一下,如果有一个开源项目,所有人必须做的是在嵌入代码的标题中添加一行,然后他们可以按照公认的Web标准(XHTML Strict,CSS3)自由编码他们的网站。

另外,这会激励网络浏览器遵循标准,或者因为所有JavaScript代码都被执行而被困在浏览器中。

那么,这可能吗?

7 个答案:

答案 0 :(得分:4)

  

另外,这会激励网络浏览器遵循标准,或者因为所有JavaScript代码都被执行而被困在浏览器中。

嗯......这就是问题所在。并非每个不兼容性都可以使用JS技巧进行平滑处理,而其他不兼容性将变得太慢而无法使用,或保留微妙的不兼容性。一个典型的例子是在IE6上伪造支持PNG文件半透明的许多脚本:它们适用于简单的情况,但对于创造性地和广泛地使用这些图像的页面而言,它们会崩溃或变得非常慢。

没有免费的午餐。

其他人指出了可以使用脚本fake features that aren't supported或库abstract away differences}的特定情况。我的建议是零碎地解决这个问题:为一个体面的浏览器编写代码,尽可能地限制自己对关键功能的通用支持功能集。然后引入黑客来修补失败的浏览器,允许自己在较旧/较小的浏览器上删除功能或优雅地降级。

不要指望它太容易了。如果那么简单,你就不会得到报酬......; - )

答案 1 :(得分:3)

查看jQuery它可以很好地标准化浏览器javascript

沿着同样的行explorercanvas为HTML浏览器标签提供HTML浏览器标记支持。

答案 2 :(得分:1)

您无法获得完全符合标准,但您可以使用一个框架来平滑一些最严重的漏洞。您还可以使用名为reset style sheet的内容。

答案 3 :(得分:1)

IE有一个库,使其更像是符合标准的浏览器:Dean Edwards' IE7

答案 4 :(得分:1)

  

像所有已知的集合   javascript hacks强迫每个   浏览器正确解释代码

您有两种选择:阅读browser compatibility tables并了解浏览器拥有的每个例外并自行创建,或使用可用的库。

如果你想要一个javascript校正抽象,你可以使用jQuery。

如果您想要css校正抽象,可以查看/IE7/

我通常不喜欢使用javascript制作的CSS更正。这是我的代码的另一个复杂性,另一个库可以向已经错误的浏览器插入错误。我更喜欢创建conditional statements到ie6,ie7等,并为每个创建单独的样式表。这种方法有效并且不会产生大量开销。

编辑:(我知道我们在其他浏览器中遇到问题,但由于IE是主要的浏览器,通常我们需要非常奇怪的黑客才能使它工作,css条件语句是一个很好的方法IMO)。

答案 5 :(得分:0)

实际上你可以,有很多库来处理这个问题。从一开始,javascript合规性问题一直是开发人员的问题,并且感谢那些开发库来解决这个问题的创新者......

其中一个,我最喜欢的是JQuery。

答案 6 :(得分:0)

在JavaScript 1.4之前,没有全局参数Array,如果没有高度高级的源过滤器,就不可能自己实现arguments数组。这意味着该语言不可能与Netscape 4.0和Internet Explorer 4.0保持向后兼容。所以我可以说没有,你不能使所有浏览器标准兼容。

Post-netscape,您可以在JavaScript本身实现该语言核心的几乎所有功能。例如,我用100%JavaScript代码编写了Array对象的所有方法。

http://openjsan.org/doc/j/jh/jhuni/StandardLibrary/1.81/index.html

如果你转到链接然后转到Array然后“source”,你可以在这里看到我的Array实现。


你们大多数人可能指的是自己实现DOM对象,这更有问题。使用VML,您可以在所有现代浏览器中实现Canvas标记,但是,您将在Internet Explorer中获得错误/勉强工作的性能,因为VML是标记,这不是实现Canvas标记的良好格式...

http://code.google.com/p/explorercanvas/

Flash / Silverlight:使用其中任何一个都可以实现Canvas标记,它可以很好地工作,你也可以实现声音。但是,如果用户没有任何浏览器插件,则无法执行任何操作。

http://www.schillmania.com/projects/soundmanager2/

DOM抽象:关于DOM的问题,您可以通过实现自己的Event对象(例如在QEvent的情况下)或甚至实现您自己的Node对象来抽象DOM。但是,在YAHOO.util.Element的情况下,这些通常会对标准API进行一些细微的更改,因此人们通常只是抽象而不是标准,并且有数百个库抽象出来。

http://code.google.com/p/qevent/

这可能是您问题的最佳答案。它使浏览器尽可能符合标准。

http://dean.edwards.name/weblog/2007/03/yet-another/