在 Firefox 上开发的 Javascript 在 IE 上失败的典型原因是啥? [关闭]

Posted

技术标签:

【中文标题】在 Firefox 上开发的 Javascript 在 IE 上失败的典型原因是啥? [关闭]【英文标题】:What are the typical reasons Javascript developed on Firefox fails on IE? [closed]在 Firefox 上开发的 Javascript 在 IE 上失败的典型原因是什么? [关闭] 【发布时间】:2011-02-05 15:23:30 【问题描述】:

我开发了一些在最近的 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 也帮了我很多。

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

【问题讨论】:

到目前为止,css 或样式没有问题,因为我从早期的编码中知道这一点。只有 JS 问题 - karlthorwald 我将首先在所有文件上运行 JSLint,有些文件我从未适应过。 "这是我的基本错误,我没有从一开始就在 jQuery 上构建我所有的东西。" ——它不会神奇地解决你所有的跨浏览器问题。在 *** 中搜索 jQuery 和 IE,你会发现很多问题。最好自己学习跨浏览器脚本,这样当 jQuery 或其数十亿粗略的插件之一失败时,您将能够实现一个真正有效的跨浏览器解决方案,并知道它有效,以及为什么。 +1 上面没有评论。你最好完全避免使用 jQuery 如果你正在学习 javascript - 如果你想快速轻松地完成复杂的事情,jQuery 非常有用,但是如果你正在学习它,它将使你免于理解 javascript 的复杂性有效 - 太多人似乎知道 jQuery,但不知道如何编写 javascript。您最初没有在 jQuery 上构建并没有犯错——您现在对自己的代码的理解比以前要好得多。 【参考方案1】:

如果您发现任何错误/遗漏等,请随时更新此列表。

注意: IE9 修复了以下许多问题,因此其中很多仅适用于 IE8 及以下版本,并且在一定程度上适用于 IE9 的怪癖模式。例如,IE9 原生支持 SVG、<canvas><audio><video>,但是您必须 enable standards compliance mode 才能使用它们。


##常规:

部分加载文档的问题:最好将 JavaScript 添加到 window.onload 或类似事件中,因为 IE 不支持部分加载文档中的许多操作。

不同的属性:在 CSS 中,IE 中的 elm.style.styleFloat 与 Firefox 中的 elm.style.cssFloat。在<label> 标签中,for 属性在 IE 中使用 elm.htmlFor 访问,而在 Firefox 中使用 elm.for 访问。请注意,for 在 IE 中是保留的,因此 elm['for'] 可能是阻止 IE 引发异常的更好主意。


##Base JavaScript 语言:

访问字符串中的字符'string'[0] 在 IE 中不受支持,因为它不在原始 JavaScript 规范中。使用'string'.charAt(0)'string'.split('')[0],注意访问数组中的项目比在IE 中使用带有字符串的charAt 快得多(尽管在第一次调用split 时会有一些初始开销。)

对象结束前的逗号: 例如'foo': 'bar', 不允许在 IE 中使用。


##Element 特定问题:

获取 IFrame 的 document

Firefox 和 IE8+: IFrame.contentDocument(IE 开始支持此 from version 8。) IE: IFrame.contentWindow.documentIFrame.contentWindow 指的是两个浏览器中的window。)

Canvas: IE9 之前的 IE 版本不支持 <canvas> 元素。 IE 确实支持VML,这是一种类似的技术,但是explorercanvas 可以为<canvas> 元素提供一个就地包装器,用于许多操作。请注意,在使用 VML 时,标准遵从模式下的 IE8 比在 quirks 模式下慢很多倍,并且出现更多故障。

SVG: IE9 原生支持 SVG。 IE6-8 可以支持 SVG,但只有 external plugins 支持 JavaScript 操作。

<audio><video>: 仅在 IE9 中受支持。

动态创建单选按钮: IE document.createElement 创建的单选按钮无法选中。另请参阅 How do you dynamically create a radio button in Javascript that works in all browsers? 了解解决此问题的方法。

<a href> 标记中嵌入JavaScript 和IE 中的onbeforeunload 冲突: 如果在a 标记的href 部分中嵌入了JavaScript(例如<a href="javascript: doStuff()">,则IE 将始终显示从onbeforeunload 返回的消息,除非事先删除了onbeforeunload 处理程序。另请参阅Ask for confirm when closing a tab。

<script> 标记事件差异: onsuccessonerror 在 IE 中不受支持,而是由 IE 特定的 onreadystatechange 替换,无论下载是否成功都会触发或失败。另请参阅JavaScript Madness 了解更多信息。


##元素大小/位置/滚动和鼠标位置:

获取元素大小/位置:在 IE 中,元素的宽度/高度有时为 elm.style.pixelHeight/Width 而不是 elm.offsetHeight/Width,但在 IE 中两者都不可靠,尤其是在 quirks 模式下,有时会得到更好的结果比另一个。

elm.offsetTopelm.offsetLeft 经常被错误地报告,导致发现元素的位置不正确,这就是为什么弹出元素等在很多情况下会偏离几个像素。

另外请注意,如果一个元素(或元素的父元素)具有 displaynone,则 IE 将在访问大小/位置属性时引发异常,而不是像 Firefox 那样返回 0

获取屏幕尺寸(获取屏幕的可视区域):

火狐: window.innerWidth/innerHeight IE标准模式: document.documentElement.clientWidth/clientHeight IE 怪癖模式: document.body.clientWidth/clientHeight

文档滚动位置/鼠标位置:这个实际上不是由 w3c 定义的,因此即使在 Firefox 中也是非标准的。要查找documentscrollLeft/scrollTop

怪癖模式下的 Firefox 和 IE: document.body.scrollLeft/scrollTop

标准模式下的 IE: document.documentElement.scrollLeft/scrollTop

注意:其他一些浏览器也使用pageXOffset/pageYOffset

  function getDocScrollPos() 
   var x = document.body.scrollLeft ||
           document.documentElement.scrollLeft ||
           window.pageXOffset || 0,
       y = document.body.scrollTop ||
           document.documentElement.scrollTop ||
           window.pageYOffset || 0;
   return [x, y];
  ;

为了得到鼠标光标的位置,mousemove事件中的evt.clientXevt.clientY会给出相对于文档的位置不加滚动位置所以前面的函数将需要合并:

 var mousepos = [0, 0];
 document.onmousemove = function(evt) 
  evt = evt || window.event;
  if (typeof evt.pageX != 'undefined') 
   // Firefox support
   mousepos = [evt.pageX, evt.pageY];
   else 
   // IE support
   var scrollpos = getDocScrollPos();
   mousepos = [evt.clientX+scrollpos[0], evt.clientY+scrollpos[1]];
  ;
 ;

##选择/范围:

<textarea><input> 选择selectionStartselectionEnd 未在 IE 中实现,取而代之的是专有的“范围”系统,另请参阅 How to get the caret column (not pixels) position in a textarea, in characters, from the start?。

获取文档中当前选中的文本:

火狐: window.getSelection().toString() IE: document.selection.createRange().text


##按 ID 获取元素:

document.getElementById 也可以引用表单中的name 属性(取决于文档中首先定义的属性),因此最好不要让不同的元素具有相同的nameid。这可以追溯到 id 不是 w3c 标准的日子。 document.all (a proprietary IE-specific property) 比 document.getElementById 快得多,但它还有其他问题,因为它总是优先于 nameid 之前。我个人使用此代码,并通过额外的检查来确定:

 function getById(id) 
  var e;
  if (document.all) 
   e = document.all[id];
   if (e && e.tagName && e.id === id) 
    return e;
   ;
  ;
  e = document.getElementById(id);
  if (e && e.id === id) 
   return e;
   else if (!e) 
   return null;
   else 
   throw 'Element found by "name" instead of "id": ' + id;
  ;
 ;

##只读innerHTML的问题:

IE确实not support设置了colcolGroupframeSethtmlheadstyletabletBody、@9876542422的innerHTML @、titletr 元素。下面是一个适用于与表格相关的元素的函数:

 function setHTML(elm, html) 
  // Try innerHTML first
  try 
   elm.innerHTML = html;
   catch (exc) 
   function getElm(html) 
    // Create a new element and return the first child
    var e = document.createElement('div');
    e.innerHTML = html;
    return e.firstChild;
   ;
   function replace(elms) 
    // Remove the old elements from 'elm'
    while (elm.children.length) 
     elm.removeChild(elm.firstChild);
    
    // Add the new elements from 'elms' to 'elm'
    for (var x=0; x<elms.children.length; x++) 
     elm.appendChild(elms.children[x]);
    ;
   ;
   // IE 6-8 don't support setting innerHTML for
   // TABLE, TBODY, TFOOT, THEAD, and TR directly
   var tn = elm.tagName.toLowerCase();
   if (tn === 'table') 
    replace(getElm('<table>' + html + '</table>'));
    else if (['tbody', 'tfoot', 'thead'].indexOf(tn) != -1) 
    replace(getElm('<table><tbody>' + html + '</tbody></table>').firstChild);
    else if (tn === 'tr') 
    replace(getElm('<table><tbody><tr>' + html + '</tr></tbody></table>').firstChild.firstChild);
    else 
    throw exc;
   ;
  ;
 ;

另请注意,在使用 document.createElement 创建时,IE 需要在将 &lt;tr&gt;s 附加到 &lt;tbody&gt; 元素之前将 &lt;tbody&gt; 添加到 &lt;table&gt;,例如:

 var table = document.createElement('table');
 var tbody = document.createElement('tbody');
 var tr = document.createElement('tr');
 var td = document.createElement('td');
 table.appendChild(tbody);
 tbody.appendChild(tr);
 tr.appendChild(td);
 // and so on

##事件差异:

获取event 变量: DOM 事件不会传递给 IE 中的函数,并且可以作为 window.event 访问。获取事件的一种常见方法是使用例如elm.onmouseover = function(evt) evt = evt||window.event如果 evt 未定义,则默认为 window.event

关键事件代码差异:关键事件代码千差万别,但如果您查看Quirksmode 或JavaScript Madness,几乎没有特定于IE,Safari 和Opera 再次不同。

鼠标事件差异: IE 中的button 属性是一个位标志,它允许同时使用多个鼠标按钮:

左: 1 (var isLeft = evt.button &amp; 1) 右: 2 (var isRight = evt.button &amp; 2) 中心: 4 (var isCenter = evt.button &amp; 4)

W3C 模型(Firefox 支持)不如 IE 模型灵活,一次只允许一个按钮,左侧为0,右侧为2,中间为1。请注意,作为 Peter-Paul Koch mentions,这是非常违反直觉的,因为 0 通常表示“没有按钮”。

offsetXoffsetY 是 problematic,最好在 IE 中避免使用它们。在 IE 中获取 offsetXoffsetY 的更可靠方法是相对定位元素的 get the position 并从 clientXclientY 中减去它。

另请注意,在 IE 中,要双击 click 事件,您需要将 clickdblclick 事件注册到函数。 Firefox 在双击时会触发 clickdblclick,因此需要特定于 IE 的检测才能具有相同的行为。

事件处理模型的区别:专有的 IE 模型和 Firefox 模型都支持自下而上的事件处理,例如如果&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt; 的两个元素中都有事件,则事件将在span then div 中触发,而不是按照传统的例如绑定的顺序触发。使用了elm.onclick = function(evt)

"Capture" 事件一般只在 Firefox 等中支持,它会触发div 然后span 事件以自上而下的顺序。 IE 有elm.setCapture()elm.releaseCapture() 用于在处理其他事件之前将鼠标事件从文档重定向到元素(在本例中为elm),但它们有许多性能和其他问题,因此应该避免。

火狐:

附加elm.addEventListener(type, listener, useCapture [true/false])分离elm.removeEventListener(type, listener, useCapture)type 是例如 'mouseover' 没有 on

IE: 在 IE 中只能在一个元素上添加一个给定类型的事件 - 如果添加了多个相同类型的事件,则会引发异常。另请注意,this 指的是window,而不是事件函数中的绑定元素(因此用处不大):

附加elm.attachEvent(sEvent, fpNotify)分离elm.detachEvent(sEvent, fpNotify)sEvent 例如'onmouseover'

事件属性差异:

阻止任何其他监听函数处理事件

火狐: evt.stopPropagation()IE: evt.cancelBubble = true

停止插入字符或阻止复选框被选中的关键事件:

Firefox: evt.preventDefault()IE: evt.returnValue = false注意: 只需在 keydown、@ 中返回 false 987654483@、mousedownmouseupclickreset 也会阻止默认设置。

获取触发事件的元素:

火狐: evt.targetIE: evt.srcElement

获取鼠标光标移开的元素:如果在onmouseout事件中,IE中的evt.fromElement在Firefox中为evt.target,否则为evt.relatedTarget

获取鼠标光标移动到的元素:如果在onmouseout事件中,IE中的evt.toElement在Firefox中为evt.relatedTarget,否则为evt.target

注意:evt.currentTarget(事件绑定的元素)在 IE 中没有等效项。

【讨论】:

非常非常非常好的列表!感谢所有贡献的人:)【参考方案2】:

如果您的代码中有逗号,请检查这些或类似的逗号

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

Firefox 将允许最后一个逗号(后面的 value2),但 IE 不允许

【讨论】:

大多数优秀的编辑都应该抓住这个 +1,我经常有这个。 如果可以的话,我会给你+10 -- 这一直发生在我身上。 哦,要添加到@SeanJA 的评论中:我最近切换到了 NetBeans,它确实抓住了这一点。 第一次做一些 JS 工作时,我在这方面浪费了很多时间。现在是我检查的第一件事!诅咒糟糕的 Textmate 扩展,留下逗号。【参考方案3】:

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

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

如果你直接开始做事,比如document.XXX(thing),那么你不在图书馆里,你直接在做javascript(都是javascript,但你明白了:),这可能会也可能不会导致问题,具体取决于 IE 团队在实现该特定功能时的醉酒程度。

在 IE 中,与原始 javascript 问题、动画偏离几个像素之类的问题相比,您更有可能在样式正确输出上失败,更多当然在 IE6 中更是如此。

【讨论】:

我现在明白了。是的,我也直接做过这样的事情。卡尔索瓦尔德 如果你使用像 Netbeans 这样的 IDE,你可以为你的 javascript 设置目标浏览器,当你做一些看起来不受支持的事情时,它也会通过警告你来帮助你。【参考方案4】:

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

【讨论】:

对不起,我很粗鲁,但 IE 真的很丑 document.getElementByIdOrNameIGuessWhateverMan(id);【参考方案5】:

有很多事情,但我曾经陷入的一个陷阱是许多浏览器接受不带引号的 JSON,而 ie6 和 ie7 不接受。

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

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

【讨论】:

请注意,这取决于上下文,对象字面量很好,JSON 不是...但是例如 jQuery 在其最新版本中根本不允许无效的 JSON。 不是我的反对意见......但你应该为其他人澄清这一点,然后向我 +1。【参考方案6】:

Differing JavaScript Support

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

New in 1.6

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

New in 1.7

解构赋值 -- [a,b] = [1,2] Iterators and Generators letconst 声明 array comprehensions

New in 1.8

数组方法 - reduce(), reduceRight() 定义函数的快捷方式。

其中一些要求您指定要在其中运行的 JavaScript 的版本号(这将在 IE 下中断),但像 [1,2,3].indexOf(2) 这样的一些东西可能看起来没什么大不了的,直到您尝试在其中运行它浏览器

【讨论】:

您在这里所说的 JavaScript 是 mozilla 的 JavaScript(TM),而不是更一般意义上的 javascript。并非所有 ECMAScript 实现/javascript 引擎(在这种情况下为 MS JScript)都应该遵循 mozilla 的 JavaScript(TM)。 ECMAScript 是标准,而不是 JavaScript(TM),并且 JavaScript(TM) 不是 javascript。我希望这是有道理的。 对我来说很有意义,但是在关于 JavaScript 和 JScript 之间兼容性的线程上,我认为这已经可以理解了 :) 当您说“IE 不支持(大部分)自 1.5 以来添加到 JavaScript 的扩展”时,听起来您是在说 mozilla 的 JavaScript(TM) 是 IE 应该遵守的标准到,当然不是。您至少可以说 Mozilla 的 JavaScript 或类似的...其他浏览器不支持所有 mozilla 对 ECMAScript 的扩展,例如解构赋值等。问题是关于“大多数”javascript 和(具体实现)@987654343 之间的差异@,而不是 Mozilla JavaScript(TM)JScript 之间的区别。显示 IE 与 ES 的偏差可能会更好。【参考方案7】:

IE 中的 JavaScript 与现代浏览器(例如 Firefox)中的 JavaScript 之间的主要差异可归因于 CSS/(X)HTML 跨浏览器差异背后的相同原因。过去没有事实上的标准。 IE/Netscape/Opera 进行了一场地盘争夺战,实施了大部分规范,但也省略了一些规范,并制定了专有规范以相互竞争。我可以继续详细介绍,但让我们跳到 IE8 的发布:JavaScript 多年来一直被避免/蔑视,随着 FF 的兴起和对 webcomm 的蔑视,IE 选择主要专注于从 IE6 开始推进其 CSS。并且基本上留下了对 DOM 的支持。 IE8 的 DOM 支持也可能是 2001 年推出的 IE6....所以 IE 的 DOM 支持比现代浏览器落后近十年。 如果你有一个布局引擎特有的 JavaScript 差异,你最好用我们处理 CSS 问题的方式来攻击它;以该浏览器为目标。不要使用浏览器嗅探,使用功能检测来嗅探您的浏览器/它的 DOM 支持级别。

JScript 不是 IE 自己的 ECMAScript 实现; JScript 是 IE 对 Netscape 的 JavaScript 的回应,这两者都在 ECMAScript 之前出现。

就脚本元素的类型属性而言,type="text/javascript" 是默认标准(至少在 HTML5 中),因此您不需要类型属性,除非您的脚本不是 JavaScript。

至于 IE 不支持 innerHTML...innerHTML 是由 IE 发明的,今天仍然不是 DOM 标准。其他浏览器采用它是因为它很有用,这就是您可以跨浏览器使用它的原因。至于动态更改表,MSDN 表示“由于表所需的特定结构,表和 tr 对象的innerText 和innerHTML 属性是只读的。”我不知道最初有多少是正确的,但显然现代浏览器在处理表格布局的复杂性时已经弄清楚了。

我强烈推荐阅读 PPK on JavaScript Jeremy Keith 的 DOM 脚本 Douglas Crockford 的 JavaScript:好的部分 和 Christian Hellman 的 Beginning JavaScript with DOM Scripting and Ajax 以深入掌握 JavaScript。

就框架/库而言,如果您对 JavaScript 还没有深入了解,则应避免使用它们。 2 年前,我陷入了 jQuery 陷阱,虽然我能够完成壮举,但我从来没有学过关于正确编码 JavaScript 的该死的东西。事后看来,jQuery 是一个非常棒的 DOM 工具包,但我未能学习正确的闭包、原型继承等,不仅让我的个人知识倒退,而且我的工作开始受到巨大的性能打击,因为我不知道自己在做什么。

JavaScript 是浏览器的语言;如果您是客户端/前端工程师,那么您最重要的是掌握 JavaScript。 Node.js 正在全面推动 JavaScript,我看到它的开发每天都取得了巨大的进步;服务器端 JavaScript 将在不久的将来成为标准。我提到这一点是为了进一步强调 JavaScript 现在和将来的重要性。

JavaScript 将比 Rails 掀起更多波澜。

脚本编写愉快!

【讨论】:

不错的答案,虽然我不同意使用特征检测来嗅探浏览器;仅使用功能检测来测试对 那些 功能的支持。另请参阅Feature detection is not browser detection 中的示例。 嗯。我完全同意你的不同意见。谢谢你明白了。我仍然是 JavaScript n00b,但在我的游戏中没有羞耻感。 “基于特征的浏览器检测是一种非常糟糕的做法,应该不惜一切代价避免。直接特征检测是一种最佳做法,而且几乎在所有情况下,这正是您所需要的。”【参考方案8】:

一些本机对象是只读的,但实际上并非如此(您可以写入它们,但没有效果)。例如,一个常见的高级 javascript 是基于通过覆盖系统方法扩展 Element 对象,例如,将 Element.prototype.appendChild() 更改为不仅仅是附加一个子节点 - 比如说,用父节点的数据初始化它。这将在 IE6 上静默失败 - 原始方法将在新对象而不是新对象上调用。

一些浏览器(我现在不记得是哪一个了)将 HTML 标记之间的换行符视为文本节点,而其他浏览器则不然。因此 childNodes(n)、nextSibling()、firstChild() 等的行为会非常不同。

【讨论】:

【参考方案9】:

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

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

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

【讨论】:

【参考方案10】:

我今天早上刚找到一个,一位同事将脚本标签设置为: &lt;script type="application/javascript"&gt; 因为他的 ide 自动完成功能在 "text/javascript" 之前就有了

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

【讨论】:

javascript 是所有浏览器的默认设置,因此请使用 &lt;script&gt;【参考方案11】:

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

替换表体 () 的内容
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);

这很有趣!

【讨论】:

我感觉你需要用&lt;tbody&gt;标签包裹它。 在原始代码中,它实际上被包裹在一个 标签中。 IE 不喜欢它仍然让我大吃一惊。我记得在微软的官方文档中阅读过它,但我现在找不到链接。对不起! 【参考方案12】:

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

【讨论】:

【参考方案13】:

IE 对丢失“;”非常严格通常是这样。

【讨论】:

我现在在 jsLinting 时发现了很多这些。似乎很重要。【参考方案14】:

我刚刚在 中遇到了这个讨厌的问题

假设你有一些这样的 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>'));

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

您提到了我不太熟悉但作为一般参考的 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 可以容忍的任何方法/标签/标识符。

【讨论】:

【参考方案17】:

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

【讨论】:

【参考方案18】:

使用console.log() 将错误输出到 Firefox 错误控制台会导致您的脚本在 IE 中失败。当你在 IE 中测试时,一定要记得把它们拿出来。

【讨论】:

我相信如果你没有打开 FireBug,即使在 Firefox 中使用 console.log 也会失败。

以上是关于在 Firefox 上开发的 Javascript 在 IE 上失败的典型原因是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Firefox 开发人员工具中查看 JavaScript 堆栈跟踪错误(如在 Chrome 中)

如何在 Chrome 或 Firefox 浏览器上运行 javascript

JavaScript之WEB开发调试利器:Firebug

JavaScript:在 Firefox for Android 上跟踪选择更改

JavaScript事件传播在HTML Button子元素上不适用于Firefox。

总结IE和Firefox的Javascript兼容性总结