4

是否有一个 JavaScript 框架专注于通过调整实现差异来扩展 JavaScript?我的意思不是一个简单地跨不同浏览器提供相同功能的框架,而是使非标准浏览器表现得好像它们符合标准的东西。

基本上,我想要一些对 JavaScript有用的东西,ie7.js对 MSIE 有用的东西或html5shiv对 HTML5 元素有用的东西。或者 Web Sockets 或 Canvas 的各种解决方法。

我想 jQuery 和它的同类可以做到这一点,但我更喜欢允许我编写正常的、符合标准的 JavaScript 的东西,就好像浏览器之间没有差异一样。

编辑:正如所有其他答案似乎都指出,是的,jQuery 是 JavaScript,是的,大多数 JavaScript 框架都试图提高跨浏览器的兼容性,让我澄清一下我的意思。

如今,跨浏览器的 JavaScript 实现之间的差异与语言本身没有太大关系。除了旧浏览器中缺少一些内置方法外,这些类型的行为也大多相同。但是仍然存在差异,尤其是当前的现状(Chrome/Firefox/Safari)和 MSIE 的旧版本(即 MSIE 7)之间。最值得注意的是,DOM 的 API 往往具有或多或少的微妙特性。

我不想要一个框架,它可以让我编写适用于大多数浏览器的 JavaScript。那是一毛钱。我想要一个薄层,让我可以编写在现代浏览器和旧版浏览器中都可以使用的代码。jQuery、Dojo 等都超越了这一点,并提供了自己独特的 API,而不是统一现有的 API。

说“使用 jQuery”就像说Rich Ajax Platform如果我想避免跨浏览器呈现差异,我应该使用(或其他代码生成框架)。我不想要一个“替代品”,我想要一个“错误修正”(不是字面意思)。

EDIT2:只是为了说明这一点:我不是在寻找任何框架。我对 jQuery 非常熟悉,已经尝试过 YUI,目前正在考虑尝试 Dojo。我不只是想要一个“好”的框架。我想要一个符合我非常具体的描述的。如果没有类似的东西也没关系,尽管知道为什么不会很有趣(即技术原因,而不是“每个人都忙于使用 jQuery”)。

4

8 回答 8

6

如果您的想法像您的帖子所暗示的那样极简主义,您可以尝试编译自己的微库,该微库为一些最常见的令人讨厌的分歧提供跨浏览器功能,例如 addEventListener 与 attachEvent、getTagsByClassName 与无方法,滚动差异、窗口尺寸等。大多数 Javascript 差异实际上是 DOM 方法中的差异,并且列表虽然很长,但不必一次编译。添加您自己的跨浏览器功能,因为它们出现在您的编码中。

除此之外,使用 jQuery。

于 2010-08-03T21:21:41.010 回答
5

所有 JavaScript 库都试图通过允许您编写干净的跨浏览器兼容 JavaScript 代码来“平衡竞争环境”。

一些最受欢迎的:

原型

MooTools

天经地义的

jQuery(我个人最喜欢的)

于 2010-08-03T21:13:41.090 回答
4

没有机会完全实现您想要的。IE 不公开 DOM 节点的原型,因此如果不对每个单独的节点进行扩展,就无法扩展它们。此外,通常(也许总是?)不可能覆盖 IE 中的 DOM 节点等宿主对象的现有只读属性,因此您将无法修复 DOM 节点本身上错误实现的 DOM 属性。即使您只是修复 DOM 方法,每次获取新节点引用时,您仍然需要调用一个函数来执行此操作:

var el = someNode.nextSibling;
fixUp(el); // Adds missing methods to the element and fixes broken ones
var matchingEls = el.getElementsByClassName("someclass");

对于为什么您想要的东西是不可能的一个非常好的详细解释,我建议您阅读以下内容:http: //perfectionkills.com/whats-wrong-with-extending-the-dom/

于 2010-08-04T13:29:20.100 回答
2

我不相信有一个简单的“使浏览器行为正确”的框架——它们都超出了这个范围。

也就是说,重新发明轮子没有任何价值,因此将时间投入到 jQuery(可能使用自定义最小构建)等方面可能是明智的,同时确保为禁用 JavaScript 的用户提供合理的回退。

于 2010-08-03T21:14:08.553 回答
1

在编写“标准”JavaScript 时,我倾向于定义自己的函数来提供常用功能的跨浏览器实现。addEventremoveEvent(有几种实现)是这种技术的常见示例。我已经研究并编写了几个函数,使我能够针对特定问题调用一个函数,而不是每次都检测并执行正确的代码。

诸如获取元素的高度、宽度和偏移量之类的事情需要针对不同的浏览器进行不同的实现,但可以很容易地写入一个函数并在任何需要它们的地方重用。

所以,我的“解决方案”主要是 DIY 解决方案。创建一个名为“utilities.js”的文件并根据需要开始添加功能。addEvent, removeEvent, 和跨浏览器XMLHttpRequest是一个很好的起点。在这里,我将开始:

function createXHR()
{
    var xhr;
    if (window.ActiveXObject)
    {
        try
        {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch(e)
        {
            alert(e.message);
            xhr = null;
        }
    }
    else
    {
        xhr = new XMLHttpRequest();
    }

    return xhr;
}

该函数将返回一个 XMLHttpRequest 对象以供您根据需要使用。享受。

编辑:请注意,这种方法理论上可能会挤满您的命名空间。您最好创建一个utilities对象,然后调用utilities.createXHR.

于 2010-08-04T13:45:48.407 回答
1

如果我对您的理解正确, http: //flowjs.com/应该与您正在寻找的内容非常接近。它的主要目标:“FlowJS 在所有现代浏览器中实现 DOM Level 3 API”

于 2010-12-19T22:14:45.473 回答
1

自从提出这个问题以来已经过去了很长时间,但也许它对某人有用:最近,金融时报的一组开发人员建立了一种通用的 polyfill,它只为不同的浏览器修补必要的部分.. http:// cdn.polyfill.io/v1/docs/

于 2014-11-20T07:50:17.187 回答
0

你用 JQuery 就可以了。使用 JQuery 使您能够以不同浏览器实现所缺乏的一致性查询 DOM。我想说的是,ajax 调用处理的是当今人们在 JavaScript 中处理的最大问题集。

于 2010-08-03T21:13:17.553 回答