对于IE中的每个JavaScript支持?

时间:2009-01-05 06:56:04

标签: javascript

我有这段代码:

<script>
function toggle(source) {

  checkboxes = document.getElementsByName('DG1');
  for each(var checkbox in checkboxes)
    checkbox.checked = source.checked;

  checkboxes = document.getElementsByName('DG2');
  for each(var checkbox in checkboxes)
    checkbox.checked = source.checked;

  checkboxes = document.getElementsByName('DG3');
  for each(var checkbox in checkboxes)
    checkbox.checked = source.checked;

  checkboxes = document.getElementsByName('DG4');
  for each(var checkbox in checkboxes)
    checkbox.checked = source.checked;

  checkboxes = document.getElementsByName('DG5');
  for each(var checkbox in checkboxes)
    checkbox.checked = source.checked;
}
</script>

<input type="checkbox" onClick="toggle(this)" />Select All<br/>

<form method=POST action="DGUsageServlet">
    <input type="checkbox" name="DG1">DG1</input>
    <input type="checkbox" name="DG2">DG2</input>
    <input type="checkbox" name="DG3">DG3</input>
    <input type="checkbox" name="DG4">DG4</input>
    <input type="checkbox" name="DG5">DG5</input>
</form>

如何让上述脚本在IE中运行?

9 个答案:

答案 0 :(得分:43)

请注意,Firefox不再支持每个循环,因此这适用于每个浏览器,而不仅仅是Internet Explorer。 See this MDN article for alternatives


Internet Explorer不支持“for each”循环(以及其他现代浏览器,它们已经不再支持它们)。您需要更改代码以使用常规for循环:

function toggle(source) {
    var checkboxes = document.getElementsByName('DG1');
    for (var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].checked = source.checked;
    }
    ...
}

或者,您可以使用像jQuery这样的库,并按照以下方式执行:

function toggle(source) {
    $("input[name^=DG]").attr("checked", source.checked);
}

答案 1 :(得分:14)

或者您可以尝试为不支持foreach方法的浏览器扩展Array对象,如下所示: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Objects:Array:forEach#Compatibility

答案 2 :(得分:6)

我认为 jQuery.each 是最佳解决方案

var idArr = ["LocationFirst","LocationSecond","LocationThird","LocationFourth","LocationFifth"];

 $.each(idArr,function(index, entry) {
   //some code
 });

它将迭代数组“idArr”中的所有元素,并且可以对每个元素做一些事情。

答案 3 :(得分:4)

原生IE8已经过时了 foreach ,但我如何使用jQuery,我选择 jQuery.each 来克服这个问题。

我从jQuery API Doc复制并粘贴:

var obj = {
   "flammable", "inflammable"
   "duh": "no duh"
};
$. each (obj, function (key, value) {
   alert (key + ":" + value);
});

http://api.jquery.com/jQuery.each/

答案 4 :(得分:3)

可以在Internet Explorer中为每个使用修改后的形式,语法如下。

var checkboxes = document.getElementsByName('DG2');
for (var i in checkboxes)
  checkboxes[i].checked = 'true';

答案 5 :(得分:3)

我在IE 11上遇到了forEach的问题

我找到了像这样的解决方案

Array.prototype.slice.call(document.getElementsByName('element_name')).forEach(function (el) {
    if (el.checked) {
       console.log('checked');
    }

这对我很有用。

答案 6 :(得分:2)

要完成Matthew Crumley的回答,您可能还会遇到IE中getElementByName()失败的问题,解释here

  

很少使用的getElementsByName()方法是DOM Level 1规范的一部分,并且受Internet Explorer和Mozilla / Firefox支持。 getElementsByName()

     

根据HTML 4.01规范,支持NAME属性的唯一元素是BUTTON, TEXTAREA, APPLET, SELECT, FORM, FRAME, IFRAME, IMG, A, INPUT, OBJECT, MAP, PARAM and META。因此,在NAME中放置DIV实际上是无效的HTML。

(因此它适用于您的情况(NAME字段的INPUT),但在IE中使用它是不安全的)

  

Moz / Firefox对此没有任何问题,并且很乐意返回所有三个DIV元素。但是,MSIE将其视为expando attribute无效的NAME属性,并排除了这些元素

this script给出了可能的解决方法。


注意:当您编码for时,alwatys会添加封闭的卷曲括号{ and }:它更安全。如果您在循环中添加第二行代码,则for块会将其考虑在内。

答案 7 :(得分:1)

您可以使用:

[].slice.call(...).forEach(...);

示例:

[].slice.call( document.querySelectorAll('h1') ).forEach(function(h1) { 
    console.log(h1);
});

或者最好加一遍:

// make IE9+ support forEach:
if (window.NodeList && !NodeList.prototype.forEach) 
    NodeList.prototype.forEach = Array.prototype.forEach;

,然后始终使用紧凑语法:

document.querySelectorAll('h1').forEach(function(h1) { 
    console.log(h1);
});

答案 8 :(得分:0)

我会稍微清理一下。

function select(){
    var butt = document.getElementById('selectall');
    butt.onclick = selectall;

    function selectall(){
        for(var i=1;i<6;i++){
            var id='DG'+i;
            var all = document.getElementById(id);
            all.setAttribute('checked','checked');
        }
    }   
}

但它仅适用于getElementById()(而不是getElementsByName(),我不明白)。只需添加到每个输入id ='selectall',id ='DG1'...