【问题标题】:for each JavaScript Support in IE?对于 IE 中的每个 JavaScript 支持?
【发布时间】:2009-01-05 06:56:04
【问题描述】:

我有这个代码:

<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 中运行?

【问题讨论】:

  • 缩进代码 4 个空格会给你代码格式。

标签: javascript


【解决方案1】:

请注意,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);
}

【讨论】:

  • 是的。多个 javascript 实现的头上的痘痘。
  • 在过去,您只需要在多个架构之间兼容 source。现在,您必须在多个浏览器架构中实现“二进制”兼容,再加上一堆松散散落的砖块,下面夹着一只死獾,尖叫着求饶。
  • -1 [1,2,3].length 可能是 4,因为 IE8 中的 toString。最好使用 hasOwnProperty。
  • @PeterRader 我不确定你指的是什么。
  • 我在你的建议中指的是length的用法。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    var idArr = ["LocationFirst","LocationSecond","LocationThird","LocationFourth","LocationFifth"];
    
     $.each(idArr,function(index, entry) {
       //some code
     });
    

    它将遍历数组“idArr”中的所有元素,并对每个元素做一些事情。

    【讨论】:

      【解决方案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/

      【讨论】:

        【解决方案5】:

        在 Internet Explorer 中可以使用 for each 的修改形式,语法如下。

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

        【讨论】:

        • i 在 ie8 中也可能是 toString
        【解决方案6】:

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

        我找到了类似的解决方法

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

        这对我来说很好用。

        【讨论】:

        • 这是最好的解决方案,恕我直言。短格式:[].slice.call( ... ).forEach( ... )
        【解决方案7】:

        要完成 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。所以在DIV 中放置NAME 实际上是无效的HTML。

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

        Moz/Firefox 对此没有问题,并且会愉快地返回所有三个 DIV 元素。但 MSIE 将无效的 NAME 属性视为 expando attribute 并排除这些元素

        this script 给出了一个可能的修复方法。


        注意:当您编写for 时,总是添加然后括起花括号{ and }:这样更安全。如果您在循环中添加第二行代码,for 块将考虑它。

        【讨论】:

          【解决方案8】:

          你可以使用:

          [].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);
          });
          

          【讨论】:

            【解决方案9】:

            我会清理一下。

            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'...

            【讨论】:

              猜你喜欢
              • 2010-12-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多