在Firefox上开发Javascript的典型原因是什么?

时间:2010-04-08 10:18:00

标签: jquery firefox yui javascript

我开发了一些在最近的Firefox和Safari上运行良好的javascript增强页面。我错过了检查Internet Explorer,现在我发现这些页面在IE 6和7上都不起作用(到目前为止)。脚本以某种方式不执行,页面显示好像javascript不存在,虽然执行了一些javascript。我使用自己的dom操作库,从YUI 2我使用YUI-Loader和XML-Http-Request,在一个页面上我使用“psupload”,这取决于JQuery。

我正在从Office XP安装Microsoft脚本编辑器,现在将进行调试。我现在也会编写具体的测试。

IE的典型失败点是什么?我可以睁开眼睛的方向。

我找到了这个页面,它显示了一些差异。访问:Quirksmode

你能从你的经验中找到一些我应该首先寻找的典型事物吗?

我稍后会在这里提出更多有关具体任务的问题,但是现在我对你的经验感兴趣,为什么IE通常会在Firefox上运行正常的脚本失败

编辑:谢谢你们所有这些伟大的答案!

与此同时,我调整了整个代码,以便它也适用于Internet Explorer。我现在整合了jQuery并构建了我自己的类。这是我的基本错误,我从一开始就没有在jQuery上构建所有的东西。现在我有了。

JSLint也帮助了我很多。

来自不同答案的许多单一问题都有帮助。

18 个答案:

答案 0 :(得分:120)

答案 1 :(得分:26)

还要检查代码中的逗号,例如这些或类似的逗号

var o={
'name1':'value1',
'name2':'value2',
} 

最后一个逗号(在value2之后)将被Firefox容忍,但不会是IE

答案 2 :(得分:12)

如果您坚持使用jQuery或YUI作为帖子被标记,那么浏览器之间的差异应该是最小的...这就是框架的用途,为您处理这些跨浏览器的差异。

举一个例子,看看quirksmode DOM traversal page,根据它IE不支持大多数事情......虽然如此,框架确实如此,例如IE不支持elem.childElementCount,但是在jQuery中:$(elem).children().size()可以在每个浏览器中获取此值。您会发现库中有一些东西可以处理跨浏览器99%的不支持案例,至少使用脚本...使用CSS您可能需要移动到库的插件,这个常见的例子就是获得圆角在IE中工作...因为它没有CSS支持。

如果你开始直接做事,比如document.XXX(thing),那么你不在图书馆,你正在直接做javascript(这是所有的javascript,但是你得到了点:),这可能或者可能不会引起问题,这取决于IE团队在实施特定功能时的醉酒程度。

使用IE浏览器,你更有可能在原型javascript问题上出现样式失败,动画几个像素关闭等等,更多 - 当然在IE6中也是如此。< / p>

答案 3 :(得分:10)

getElementbyID也将与IE中的name属性匹配,但不会与其他浏览器匹配,IE将选择它首先找到的任何一个。

示例:

<script>
 var foo = document.getElementById('bar');
</script>

....
<input name="bar" type="text" />  //IE will get this element
<span id="bar"> Hello, World! </span>  //FF,Safari,Chrome will get this element

答案 4 :(得分:5)

有很多东西,但我曾经陷入过的一个陷阱是许多浏览器接受没有引号的JSON,而ie6和ie7则没有。

{ name: "Jakob" } // will often work, but not in ie6/ie7
{ "name": "Jakob" } // Better!

编辑:为了澄清,这只是需要实际JSON时的问题,而不是对象文字。 JSON是对象文字语法的一个子集,它是一种数据交换格式(如XML),这就是为什么它被设计为更挑剔。

答案 5 :(得分:5)

Differing JavaScript Support

自1.5以来,IE不支持(大部分)添加到JavaScript的扩展程序。

New in 1.6

  • 数组方法 - indexOf()lastIndexOf()every()filter()forEach()map()some()
  • for each ... in - 迭代值而不是属性名称。

New in 1.7

New in 1.8

  • 数组方法 - reduce()reduceRight()
  • 定义功能的快捷方式。

其中一些要求你指定要在其下运行的JavaScript版本号(在IE下会破坏),但有些像[1,2,3].indexOf(2)这样的东西可能看起来不是那么大,直到你尝试运行它在IE中

答案 6 :(得分:3)

答案 7 :(得分:2)

有些本机对象是只读的,但实际上看起来并不是这样(你可以写它们但它没有效果)。例如,一个常见的高级javascript基于通过覆盖系统方法来扩展Element对象,比如,更改Element.prototype.appendChild()除了附加一个子节点之外 - 比如用父数据初始化它。这将在IE6上无声地失败 - 将在新对象而不是新对象上调用原始方法。

有些浏览器(我现在不记得)将HTML标记之间的换行符视为文本节点,而其他浏览器则不然。因此,childNodes(n),nextSibling(),firstChild()等的行为会有很大不同。

答案 8 :(得分:2)

我今天早上刚发现一个,同事将脚本标记设置为: <script type="application/javascript">因为他的ide autocomplete在“text / javascript”

之前有

但是,事实证明,如果您使用“application / javascript”,IE只会忽略整个脚本,您需要使用“text / javascript”

答案 9 :(得分:2)

前几天我用Internet Explorer发现了一个奇怪的怪癖。我正在使用YUI,并通过设置innerHTML

替换表body()的内容
Y.one('#elementId').set('innerHTML', '<tr><td>Column 1</td></tr>');

除了IE之外,这适用于所有浏览器。我终于发现你无法替换IE中表的innerHTML。我必须使用YUI创建一个节点,然后附加该节点。

var myNode = Y.node.create('<tr><td>Column 1</td></tr>');
Y.one('#elementId').append(myNode);

这很有趣!

答案 10 :(得分:2)

数组和对象文字中的尾随逗号曾经是一个问题,最近没有检查过(意味着IE8):

var a = [ 1, 2, 3, ];
var o = { a:1, b:2, c:3, };

这会在生成服务器端的结构时产生一些额外的代码。

答案 11 :(得分:1)

额外的逗号和缺少的逗号曾经是IE上的常见问题,而它在FF上运行顺利。

答案 12 :(得分:1)

IE非常严格缺少“;”通常都是这样。

答案 13 :(得分:1)

对于它的价值,我刚刚在&lt;中找到了这个令人讨厌的问题。 IE9

说你有一些像这样的HTML:

<table><tr><td>some content...</td></tr></table>

由于某种原因(我有一个好的)你需要在最后一次关闭TR之前检索表中的所有HTML你可能会尝试这样的事情:

var tableHtml = document.getElementById('thetable').innerHTML;
var fragment = tableHtml.substring(0, tableHtml.lastIndexOf('</tr>'));

&LT; IE9将在此处返回任何内容(-1),因为tableHtml变量包含所有html标签的大写,而lastIndexOf区分大小写。为了解决这个问题,我必须在lastIndexOf之前输入一个toLowerCase()。

答案 14 :(得分:0)

IE不是现代浏览器,只能松散地遵循ECMAScript。

答案 15 :(得分:0)

你提到了我不太熟悉的jQuery,但是对于一般的参考,特别是Prototype,需要注意的一件事是IE中的保留字/方法名称。我知道经常给我带来的是:

someElement.appendChild(new Element('label',{ **for**: someInput.id }).update( someLabelText );

(new Element(tagName,propertyHash)是在Protitype中创建新元素的方式)。在IE中,for:必须为'for':,因为for是保留字。这完全合情合理 - 但FireFox会容忍这一点。

另一个例子:

someElement.wrap('div').addClassName('someClass')

(Prototype中的wrap方法将一个元素包装在另一个元素中 - 在IE中,在textareas上,wrap是一个属性,必须使用Element.wrap()而不是方法化版本

从我的经验中可以想到这两个例子。它们基于原型,但核心问题不是:注意IE认为保留字但FireFox或Safari可以容忍的任何方法/标签/标识符。

答案 16 :(得分:0)

事实是IE不支持JavaScript ......它支持他自己的ECMAScript实现:JScript ......这有点不同......

答案 17 :(得分:0)

使用console.log()向Firefox错误控制台输出错误将导致您的脚本在IE中失败。在IE中测试时要记得把它们拿出去。