就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果你觉得这个问题可以改进并可能重新打开,visit the help center 寻求指导。
8年前关闭。
我开发了一些 javascript 增强页面,它们在最近的 Firefox 和 Safari 上运行良好。我错过了检查 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 也帮了我很多。
来自不同答案的许多单一问题都有帮助。
最佳答案
如果您发现任何错误/遗漏等,请随时更新此列表。
注意: IE9 修复了以下许多问题,因此很多这仅适用于 IE8 及以下版本,并且在一定程度上适用于 IE9 的 quirks 模式。例如,IE9 原生支持 SVG、 <canvas>
、 <audio>
和 <video>
,但是您必须 enable standards compliance mode 才能使用它们。
##一般:
window.onload
或类似的事件中,因为 IE 中的许多操作不支持部分加载的文档。elm.style.styleFloat
,在 Firefox 中是 0x25134312。在 elm.style.cssFloat
标签中,<label>
属性在 IE 中使用 for
访问,而在 Firefox 中使用 elm.htmlFor
访问。请注意, elm.for
在 IE 中是保留的,因此 for
可能是阻止 IE 引发异常的更好主意。##Base JavaScript 语言:
elm['for']
在 IE 中不受支持,因为它不在原始 JavaScript 规范中。使用 'string'[0]
或 'string'.charAt(0)
注意到访问数组中的项目比使用 'string'.split('')[0]
和 IE 中的字符串快得多(尽管在 0x25181224313 首次调用时有一些初始开销)。charAt
在 IE 中是不允许的。##Element 特定问题:
split
:{'foo': 'bar',}
(IE开始支持此from version 8。)document
IFrame.contentDocument
指的是两种浏览器中的 IFrame.contentWindow.document
。) IFrame.contentWindow
元素。 IE 确实支持 VML,但这是一种类似的技术,explorercanvas 可以为许多操作提供 window
元素的就地包装器。请注意,标准合规模式下的 IE8 比使用 VML 时在 quirks 模式下要慢很多倍,并且有更多的故障。<canvas>
和 <canvas>
: 仅支持 IE9。<audio>
创建的单选按钮无法检查。另请参阅 How do you dynamically create a radio button in Javascript that works in all browsers? 以了解解决此问题的方法。<video>
标签和document.createElement
冲突IE:如果有嵌入的JavaScript在<a href>
标签的onbeforeunload
一部分(例如href
那么IE将始终显示,除非a
处理程序预先除去从<a href="javascript: doStuff()">
返回的消息也见Ask for confirm when closing a tab .onbeforeunload
标签事件差异: onbeforeunload
和<script>
在IE不支持通过IE特定onsuccess
无论下载是否成功或失败,其被解雇了一名被替换。另请参阅 JavaScript Madness 了解更多信息。##元素大小/位置/滚动和鼠标位置:
onerror
而不是 0x2314,但有时在其他模式下比 0x2314 更好,但在 IE8 中,这两种模式都不是特别可靠,但onreadystatechange
和 elm.style.pixelHeight/Width
经常报错,导致查找元素位置不正确,这就是为什么弹出元素等在很多情况下会偏离几个像素的原因。另请注意,如果元素(或元素的父元素)的
elm.offsetHeight/Width
为 elm.offsetTop
,则 IE 将在访问大小/位置属性时引发异常,而不是像 Firefox 那样返回 elm.offsetLeft
。display
none
0
window.innerWidth/innerHeight
的 document.documentElement.clientWidth/clientHeight
/document.body.clientWidth/clientHeight
:scrollLeft
scrollTop
document
/document.body.scrollLeft/scrollTop
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];
};
为了获取鼠标光标的位置,
document.documentElement.scrollLeft/scrollTop
事件中的 pageXOffset
和 pageYOffset
将给出相对于文档的位置而不添加滚动位置,因此需要合并之前的函数: 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]];
};
};
##选择/范围:
evt.clientX
和evt.clientY
选择:mousemove
和<textarea>
在IE不落实,并有一个专有的“范围”系统在其位,也How to get the caret column (not pixels) position in a textarea, in characters, from the start?见。<input>
selectionStart
##通过ID获取元素:
selectionEnd
也可以引用表单中的 window.getSelection().toString()
属性(取决于在文档中首先定义的是哪个)所以最好不要有不同的元素,它们具有相同的 0x251843122 和 0x251843122这可以追溯到 document.selection.createRange().text
不是 w3c 标准的时代。 document.getElementById
( a proprietary IE-specific property ) 比 name
快得多,但它还有其他问题,因为它总是优先于 name
0x23411 之前的 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:
id
的innerHTML,document.all
,document.getElementById
,name
,id
,col
,colGroup
,frameSet
,html
,head
,style
,和table
元素。这是一个可以解决与表格相关的元素的函数: 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;
};
};
};
另请注意,IE 需要将 tBody
添加到 tFoot
,然后再将 tHead
s 附加到 title
元素之前,例如使用 10323 创建 1,1345 元素时: 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
##事件差异:
tr
变量: DOM 事件不会传递给 IE 中的函数,可作为 0x23413 访问获取事件的一种常见方法是使用例如<tbody>
如果 <table>
未定义,则默认为 <tr>
。<tbody>
属性是一个位标志,允许同时使用多个鼠标按钮:document.createElement
) event
) window.event
) W3C 模型(Firefox 支持)不如 IE 模型灵活,一次只允许一个按钮,左侧为
elm.onmouseover = function(evt) {evt = evt||window.event}
,右侧为 window.event
,中心为 evt
。请注意,作为 Peter-Paul Koch JavaScript Madness ,这是非常违反直觉的,因为 button
通常意味着“没有按钮”。var isLeft = evt.button & 1
和 var isRight = evt.button & 2
是 mentions,最好在 IE 中避免它们。在 IE 中获取 var isCenter = evt.button & 4
和 0
的一种更可靠的方法是将相对定位元素的 problematic 和 0x251812231343124113134312413 和 30x2518122413 相减。另请注意,在 IE 中要双击
2
事件,您需要将 1
和 0
事件注册到函数。 Firefox 在双击时会触发 offsetX
以及 offsetY
,因此需要特定于 IE 的检测才能具有相同的行为。offsetX
的两个元素中都有事件,则事件将在 offsetY
中触发,然后是 clientX
,而不是它们绑定(bind)的顺序,如果是传统的,例如使用了 clientY
。 “捕获”事件通常仅在 Firefox 等中受支持,这将按自上而下的顺序触发 click
和 click
事件。 IE 有 dblclick
和 click
用于在处理其他事件之前将鼠标事件从文档重定向到元素(在这种情况下为 dblclick
),但它们有许多性能和其他问题,因此应该避免。附加 :
<div><span></span></div>
分离 : span
( div
是例如 elm.onclick = function(evt) {}
没有 div
)span
指的是 elm.setCapture()
而不是事件函数中的绑定(bind)元素(因此不太有用):附加 :
elm.releaseCapture()
分离 : elm
( elm.addEventListener(type, listener, useCapture [true/false])
例如 elm.removeEventListener(type, listener, useCapture)
)火狐:
type
IE: 'mouseover'
火狐:
on
IE: this
注:刚刚回国的window
elm.attachEvent(sEvent, fpNotify)
,elm.detachEvent(sEvent, fpNotify)
,sEvent
,'onmouseover'
,evt.stopPropagation()
和evt.cancelBubble = true
也将防止违约。火狐:
evt.preventDefault()
IE: evt.returnValue = false
false
在IE是在Firefox keydown
如果在一个事件keypress
,否则mousedown
mouseup
在IE是在Firefox click
如果在一个事件reset
,否则evt.target
evt.srcElement
(事件绑定(bind)到的元素)在 IE 中没有等效项。关于jquery - 在 Firefox 上开发的 Javascript 在 IE 上失败的典型原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2599020/