Javascript 对象没有';t支持属性或方法';增补列表器';

Javascript 对象没有';t支持属性或方法';增补列表器';,javascript,jquery,Javascript,Jquery,我在IE 8-7上收到一个错误,当我使用下面的代码时,该对象不支持属性或方法“addEventListener”。有人知道我如何使下面的代码与IE8-7兼容吗?谢谢 document.getElementById('clear').addEventListener('click', function () { ["A1","A2","A3","A4","A5","A6", "A1_flip", ].forEach(function(id) { document.getEle

我在IE 8-7上收到一个错误,当我使用下面的代码时,该对象不支持属性或方法“addEventListener”。有人知道我如何使下面的代码与IE8-7兼容吗?谢谢

 document.getElementById('clear').addEventListener('click', function () {
  ["A1","A2","A3","A4","A5","A6", "A1_flip", 

  ].forEach(function(id) {
    document.getElementById(id).checked = false;
  });
  return false;
}) 
旧版本的Internet Explorer(即7-8)中不支持此功能,因此您将无法在试图针对的浏览器上使用它

你可以考虑使用jQuery的函数来连接这个文件,假设你使用的是一个jQuery版本,它是针对老浏览器的,因为它通常有必要的回退来支持它。

$('#clear').on('click', function () {
   var elements = ["A1","A2","A3","A4","A5","A6", "A1_flip"];
   elements.forEach(function(id) {
         $("#" + id).prop("checked", false);
   });
   return false;
}) 

这是因为它们不支持
addEventListener
。有关详细信息,请参阅

但既然您已经说过要使用jQuery,那么您可以…使用jQuery来解决这个问题:

$('#clear').on('click', function () {
  ["A1","A2","A3","A4","A5","A6", "A1_flip"
  ].forEach(function(id) {
    $("#" + id).prop("checked", false);
  });
  return false;
});
或者实际上,我们可以更直接一点:

$('#clear').on('click', function () {
  $("#" + ["A1","A2","A3","A4","A5","A6", "A1_flip"].join(", #")).prop("checked", false);
  return false;
});
…它通过从数组构建选择器字符串来工作

我刚刚意识到我假设数组的内容不同。如果他们没有,如果你真的想要这些特定元素:

$('#clear').on('click', function () {
  $("#A1, #A2, #A3, #A4, #A5, #A6, #A1_flip").prop("checked", false);
  return false;
});
…或者更好的是,给他们一个通用的
并使用

$('#clear').on('click', function () {
  $(".the-class").prop("checked", false);
  return false;
});

如果您没有使用jQuery,只是错误地标记了它,请参阅上面的链接问题。其中一个答案是我的,它提供了一个处理跨浏览器事件处理的
hookEvent
函数:

var hookEvent = (function() {
    var div;

    // The function we use on standard-compliant browsers
    function standardHookEvent(element, eventName, handler) {
        element.addEventListener(eventName, handler, false);
        return element;
    }

    // The function we use on browsers with the previous Microsoft-specific mechanism
    function oldIEHookEvent(element, eventName, handler) {
        element.attachEvent("on" + eventName, function(e) {
            e = e || window.event;
            e.preventDefault = oldIEPreventDefault;
            e.stopPropagation = oldIEStopPropagation;
            handler.call(element, e);
        });
        return element;
    }

    // Polyfill for preventDefault on old IE
    function oldIEPreventDefault() {
        this.returnValue = false;
    }

    // Polyfill for stopPropagation on old IE
    function oldIEStopPropagation() {
        this.cancelBubble = true;
    }

    // Return the appropriate function; we don't rely on document.body
    // here just in case someone wants to use this within the head
    div = document.createElement('div');
    if (div.addEventListener) {
        div = undefined;
        return standardHookEvent;
    }
    if (div.attachEvent) {
        div = undefined;
        return oldIEHookEvent;
    }
    throw "Neither modern event mechanism (addEventListener nor attachEvent) is supported by this browser.";
})();
然后:


如果您希望更好地兼容过时的浏览器,并且不需要jQuery的所有新特性,那么您就可以使用jQuery。您可以考虑只切换到jQuery 1.1x(当前为1.12)。它将为您节省大量处理兼容问题的时间


ref:

您已将问题标记为jQuery,但未在问题中使用任何jQuery。这个问题是人们使用jQuery的原因之一。什么样的元素有这个id?您将问题标记为HTML,您应该共享您的HTML代码,也请注意正确标记。此问题与以下任何标记无关:、或。它确实与.IE9+在不处于(处于)兼容模式时具有
addEventListener
有关。感谢T.J.我失去了一个快速的“caniuse”参考,除了IE 11之外,它没有列出任何内容。我已经更新了响应,以便在这些方面更加准确。您必须单击caniuse上的“全部显示”以查看过时的浏览器。感谢您的时间和代码解释。这是非常有用的。一切都很顺利。我只是在IE 8中遇到一个问题,即对象不支持属性或方法“forEach”,我可能必须用不同的代码替换“forEach”。正确,直到IE 9才支持
Array.forEach()
函数。谢谢,jQuery代码。代码允许我在IE8上运行页面。但是,除了IE8中的以下“对象不支持属性或方法'forEach'”之外,其他一切都正常工作。是否有其他代码可以替代.forEach?感谢您的时间和解释,这非常有帮助。@user7293417:啊,好老的IE8,它还没有消失。:-)请参阅,以了解在数组中循环的所有方法。:-)但是,请参见上面答案中jQuery部分的更新,您可以完全避免在代码中循环使用数组,甚至可以完全避免使用数组。享受!:-)谢谢你,不过,我有点困惑。我尝试使用$.each(e,函数(id){$(“#”+id).prop(“checked”,false);}我执行的效果是清除复选框。除非我添加forEach,否则此代码无法清除。但是,在示例链接中,我应该显式地使用for In、for of或迭代器吗?我很抱歉问了大量问题/我的误解。谢谢您的时间。@user7293417:您看到了对的更新吗答案是你根本不需要使用循环?
hookEvent(document.getElementById('clear'), 'click', function(e) {
  ["A1","A2","A3","A4","A5","A6", "A1_flip"
  ].forEach(function(id) {
    document.getElementById(id).prop("checked", false);
  });
  e.preventDefault();
});