在 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
:
IFrame.contentDocument
(IE 开始支持此 from version 8。)
IE: IFrame.contentWindow.document
(IFrame.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>
标记事件差异: onsuccess
和 onerror
在 IE 中不受支持,而是由 IE 特定的 onreadystatechange
替换,无论下载是否成功都会触发或失败。另请参阅JavaScript Madness 了解更多信息。
##元素大小/位置/滚动和鼠标位置:
获取元素大小/位置:在 IE 中,元素的宽度/高度有时为elm.style.pixelHeight/Width
而不是 elm.offsetHeight/Width
,但在 IE 中两者都不可靠,尤其是在 quirks 模式下,有时会得到更好的结果比另一个。
elm.offsetTop
和elm.offsetLeft
经常被错误地报告,导致发现元素的位置不正确,这就是为什么弹出元素等在很多情况下会偏离几个像素。
另外请注意,如果一个元素(或元素的父元素)具有 display
或 none
,则 IE 将在访问大小/位置属性时引发异常,而不是像 Firefox 那样返回 0
。
获取屏幕尺寸(获取屏幕的可视区域):
火狐:window.innerWidth/innerHeight
IE标准模式: document.documentElement.clientWidth/clientHeight
IE 怪癖模式: document.body.clientWidth/clientHeight
文档滚动位置/鼠标位置:这个实际上不是由 w3c 定义的,因此即使在 Firefox 中也是非标准的。要查找document
的scrollLeft
/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.clientX
和evt.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>
选择:selectionStart
和 selectionEnd
未在 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
属性(取决于文档中首先定义的属性),因此最好不要让不同的元素具有相同的name
和id
。这可以追溯到 id
不是 w3c 标准的日子。 document.all
(a proprietary IE-specific property) 比 document.getElementById
快得多,但它还有其他问题,因为它总是优先于 name
在 id
之前。我个人使用此代码,并通过额外的检查来确定:
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设置了col
、colGroup
、frameSet
、html
、head
、style
、table
、tBody
、@9876542422的innerHTML @、title
和 tr
元素。下面是一个适用于与表格相关的元素的函数:
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 需要在将 <tr>
s 附加到 <tbody>
元素之前将 <tbody>
添加到 <table>
,例如:
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
属性是一个位标志,它允许同时使用多个鼠标按钮:
var isLeft = evt.button & 1
)
右: 2 (var isRight = evt.button & 2
)
中心: 4 (var isCenter = evt.button & 4
)
W3C 模型(Firefox 支持)不如 IE 模型灵活,一次只允许一个按钮,左侧为0
,右侧为2
,中间为1
。请注意,作为 Peter-Paul Koch mentions,这是非常违反直觉的,因为 0
通常表示“没有按钮”。
offsetX
和 offsetY
是 problematic,最好在 IE 中避免使用它们。在 IE 中获取 offsetX
和 offsetY
的更可靠方法是相对定位元素的 get the position 并从 clientX
和 clientY
中减去它。
另请注意,在 IE 中,要双击 click
事件,您需要将 click
和 dblclick
事件注册到函数。 Firefox 在双击时会触发 click
和 dblclick
,因此需要特定于 IE 的检测才能具有相同的行为。
事件处理模型的区别:专有的 IE 模型和 Firefox 模型都支持自下而上的事件处理,例如如果<div><span></span></div>
的两个元素中都有事件,则事件将在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@、mousedown
、mouseup
、click
和 reset
也会阻止默认设置。
获取触发事件的元素:
火狐: evt.target
IE: 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
let
和 const
声明
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】:我今天早上刚找到一个,一位同事将脚本标签设置为:
<script type="application/javascript">
因为他的 ide 自动完成功能在 "text/javascript" 之前就有了
但是,事实证明,如果你使用“application/javascript”,IE 会忽略整个脚本,你需要使用“text/javascript”
【讨论】:
javascript 是所有浏览器的默认设置,因此请使用<script>
【参考方案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);
这很有趣!
【讨论】:
我感觉你需要用<tbody>
标签包裹它。
在原始代码中,它实际上被包裹在一个 标签中。 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:在 Firefox for Android 上跟踪选择更改