我开发了一些在最近的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也帮助了我很多。
来自不同答案的许多单一问题都有帮助。
答案 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)
自1.5以来,IE不支持(大部分)添加到JavaScript的扩展程序。
indexOf()
,lastIndexOf()
,every()
,filter()
,forEach()
,map()
,some()
for each ... in
- 迭代值而不是属性名称。[a,b] = [1,2]
let
和yeild
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中测试时要记得把它们拿出去。