2017-04-12 80 views
-1

我在IE 8-7上收到一條錯誤消息,說當我使用下面的代碼時,Object不支持屬性或方法'addEventListener'。有誰知道我可以如何使代碼與IE8-7兼容?感謝對象不支持屬性或方法'addEventListener'

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

    ].forEach(function(id) { 
    document.getElementById(id).checked = false; 
    }); 
    return false; 
}) 
+0

您已經標記問題jQuery的,但你不能在這個問題使用任何jQuery的。這個問題是人們使用jQuery的一個問題。 –

+0

這個id是什麼樣的元素? 您將問題標記爲HTML,您應該分享您的html代碼 –

+1

請注意正確標記。這個問題與這些標籤無關:[tag:css3],[tag:function],[tag:frontend]或[tag:html]。它**確實需要處理[tag:javascript]。 –

回答

1

這是因爲他們不支持addEventListener。詳細信息請參見this question's answers

但既然你說你正在使用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; 
}); 

...或者更好的是,給他們一個共同的class和使用

$('#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."; 
})(); 

然後:

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(); 
}); 
+0

謝謝你,jQuery代碼。該代碼允許我在IE8上運行該頁面。但是,在IE8中,除了下面的「對象不支持屬性或方法forEach'」之外,所有的東西都起作用了。是否有另一個代碼可以用來代替.forEach?感謝您的時間和解釋,這非常有幫助。 – user7293417

+0

@ user7293417:啊,老舊的IE8,它還沒有消失。 :-)查看[這個問題的答案](http://stackoverflow.com/questions/9329446/for-each-over-an-array-in-javascript)你可以循環訪問數組的所有方法。 :-) **但**,另請參閱上面的答案中的jQuery部分的更新,您可以避免完全在代碼中循環訪問數組 - 甚至可能完全避免使用數組。請享用! :-) –

+0

但是,謝謝你,我有點困惑。我嘗試使用$ .each(e,function(id){ \t $(「#」+ id).prop(「checked」,false); }我進行的效果是清除複選框。代碼,除非我添加了forEach。但是,在示例鏈接中,我想明確地使用for-in,for,還是iterator?我很抱歉詢問了大量的問題/我的誤解,謝謝你的時間。 – user7293417

1

支持addEventListener()功能在舊版本的Internet Explorer(即7-8)的,所以你不能把它用在你正試圖針對瀏覽器。

假設您使用的是針對舊版瀏覽器的jQuery版本,您可以考慮使用jQuery的on()函數進行配線,因爲它通常會有必要的回退來支持它。

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

IE9 +在不處於(in)兼容模式時具有'addEventListener'。 –

+0

謝謝T.J.我離開了一個快速的「caniuse」參考,它沒有任何東西,除了IE 11上市。我已經更新了回覆,在這些方面更精確一些。 –

+1

你必須點擊caniuse上的「Show All」才能看到過時的瀏覽器。 –

0

如果要過時的瀏覽器加上不是真的更好的兼容性jQuery的新特性是必需的。你可能會考慮切換到jQuery 1.1X(目前是1.12)。它將爲您解決兼容性問題節省大量時間。

裁判:jQuery - Browser support

相關問題