jquery - 在 Firefox 上开发的 Javascript 在 IE 上失败的典型原因是什么?

标签 jquery firefox yui javascript

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果你觉得这个问题可以改进并可能重新打开,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 才能使用它们。

##一般:

  • 部分加载文档的问题: 最好将 JavaScript 添加到 window.onload 或类似的事件中,因为 IE 中的许多操作不支持部分加载的文档。
  • 不同的属性 :在 CSS 中,在 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 特定问题:
  • 获取 IFrame split :
  • Firefox和IE8 +: {'foo': 'bar',}(IE开始支持此from version 8。)
  • IE: document
  • (IFrame.contentDocument 指的是两种浏览器中的 IFrame.contentWindow.document。)

  • Canvas: IE9 之前的 IE 版本不支持 IFrame.contentWindow 元素。 IE 确实支持 VML,但这是一种类似的技术,explorercanvas 可以为许多操作提供 window 元素的就地包装器。请注意,标准合规模式下的 IE8 比使用 VML 时在 quirks 模式下要慢很多倍,并且有更多的故障。
  • SVG: IE9 原生支持 SVG。 IE6-8 可以支持 SVG,但只能支持 external plugins,其中只有一些插件支持 JavaScript 操作。
  • <canvas><canvas> : 仅支持 IE9。
  • 动态创建单选按钮: IE <8 有一个错误,使使用 <audio> 创建的单选按钮无法检查。另请参阅 How do you dynamically create a radio button in Javascript that works in all browsers? 以了解解决此问题的方法。
  • 内嵌的JavaScript在<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 了解更多信息。

  • ##元素大小/位置/滚动和鼠标位置:
  • 获取元素大小/位置 :元素的宽度/高度在 IE 中有时是 onerror 而不是 0x2314,但有时在其他模式下比 0x2314 更好,但在 IE8 中,这两种模式都不是特别可靠,但
  • onreadystatechangeelm.style.pixelHeight/Width 经常报错,导致查找元素位置不正确,这就是为什么弹出元素等在很多情况下会偏离几个像素的原因。
    另请注意,如果元素(或元素的父元素)的 elm.offsetHeight/Widthelm.offsetTop,则 IE 将在访问大小/位置属性时引发异常,而不是像 Firefox 那样返回 elm.offsetLeft
  • 获取屏幕尺寸 (获取屏幕可视区域):
  • 火狐: display
  • IE 标准模式: none
  • IE 怪癖模式: 0

  • 文档滚动位置/鼠标位置 :这实际上不是由 w3c 定义的,因此即使在 Firefox 中也是非标准的。要找到 window.innerWidth/innerHeightdocument.documentElement.clientWidth/clientHeight/document.body.clientWidth/clientHeight :
  • 怪癖模式下的 Firefox 和 IE: scrollLeft
  • 标准模式下的IE: 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 事件中的 pageXOffsetpageYOffset 将给出相对于文档的位置而不添加滚动位置,因此需要合并之前的函数:
     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.clientXevt.clientY选择:mousemove<textarea>在IE不落实,并有一个专有的“范围”系统在其位,也How to get the caret column (not pixels) position in a textarea, in characters, from the start?见。
  • 获取文档中当前选中的文本:
  • 火狐: <input>
  • IE: 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:
  • IE确实not support设置id的innerHTML,document.alldocument.getElementByIdnameidcolcolGroupframeSethtmlheadstyle,和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>
  • 关键事件代码差异: 关键事件代码变化很大,但如果你看 Quirksmode 或 022141 和 1 的 Safari 和 1 的 154 IE 几乎没有区别
  • 鼠标事件差异: IE 中的 <tbody> 属性是一个位标志,允许同时使用多个鼠标按钮:
  • 左: 1 ( document.createElement )
  • 右: 2 ( event )
  • 中心: 4 ( 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 & 1var isRight = evt.button & 2mentions,最好在 IE 中避免它们。在 IE 中获取 var isCenter = evt.button & 40 的一种更可靠的方法是将相对定位元素的 problematic 和 0x251812231343124113134312413 和 30x2518122413 相减。
    另请注意,在 IE 中要双击 2 事件,您需要将 10 事件注册到函数。 Firefox 在双击时会触发 offsetX 以及 offsetY,因此需要特定于 IE 的检测才能具有相同的行为。
  • 事件处理模型的差异: 专有 IE 模型和 Firefox 模型都支持自下而上的事件处理,例如如果 offsetX 的两个元素中都有事件,则事件将在 offsetY 中触发,然后是 clientX,而不是它们绑定(bind)的顺序,如果是传统的,例如使用了 clientY。 “捕获”事件通常仅在 Firefox 等中受支持,这将按自上而下的顺序触发 clickclick 事件。 IE 有 dblclickclick 用于在处理其他事件之前将鼠标事件从文档重定向到元素(在这种情况下为 dblclick),但它们有许多性能和其他问题,因此应该避免。
  • 火狐:
    附加 : <div><span></span></div> 分离 : span( div 是例如 elm.onclick = function(evt) {} 没有 div )
  • IE: 只能在 IE 中添加元素上给定类型的单个事件 - 如果添加多个相同类型的事件,则会引发异常。另请注意, 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/

    相关文章:

    jquery - 在 HREF 中的特定文本上隐藏 div

    javascript - Firefox Javascript div 旋转不起作用,但在 Chrome 和 Safari 中起作用

    java - 远程网络驱动程序无法启动 - Selenium 网格

    javascript - 为什么 yui DOM-create 方法有一个名为 'yui3-big-dummy' 的类的处理程序?

    php - 有谁知道开始使用 YUI 的好网站吗?

    javascript - YUI - 优点和缺点

    javascript - 当任何 block 级元素的视口(viewport)较窄时添加水平滚动条

    jquery - 用于测试非纯 Javascript 函数的 qUnit 与 Selenium

    jquery - 使用 jQuery 禁用超链接

    node.js - puppeteer 一起下载 firefox 和 chrome 二进制文件