【问题标题】:Select all input not working in IE8选择所有在 IE8 中不起作用的输入
【发布时间】:2012-01-18 00:48:22
【问题描述】:

我在此页面上有一个全选按钮,该按钮适用于其他浏览器但不适用于 IE8,除了查看我的源代码外,任何人都可以看到问题吗?

更新:

这是我的代码:

<td valign="middle" align="center"><input type="checkbox" name="products-quote[]" value="<?php echo $product_option['id']; ?>" /></td>
<td valign="middle" align="center"><input type="checkbox" name="products-sample[]" value="<?php echo $product_option['id']; ?>" /></td>

<script language="JavaScript">
function toggle(source) {
  checkboxes = document.getElementsByName(source.name);
  for(var i in checkboxes)
    checkboxes[i].checked = source.checked;
}
</script>

    <tr>
    <td valign="middle" align="center"><input type="checkbox" onClick="toggle(this)" name="products-quote[]" value="0" /></td>
    <td valign="middle" align="center"><input type="checkbox" onClick="toggle(this)" name="products-sample[]" value="0" /></td>
    <td><p><b>Select all</b></p></td>
    </tr>

【问题讨论】:

  • 当你开始赏金时 - 你真的应该选择一个答案..无论如何你都会给予赏金(这就是赏金的运作方式)所以你最好选择答案 - 无论如何下一次

标签: internet-explorer-8 input cross-browser


【解决方案1】:

为什么不使用document.forms['myForm'].elementscollection?

【讨论】:

    【解决方案2】:

    你犯了以下错误:

    1. 如果 PHP 部分被忽略,您的标记片段无效 → W3C Markup Validator
    2. 您没有使用var 关键字声明checkboxes (本地)变量,这很容易出错。
    3. 您尚未将向后兼容的实时集合用于由W3C DOM Level 2 HTML 标准化的表单和表单控件。
    4. 您尝试使用for-in 语句迭代实现W3C DOM Level 2+ CoreNodeList 接口的对象的属性。 for-in 迭代对象的可枚举属性,但此类宿主对象的属性不需要是可枚举的。事实上,它们的具有数字名称的属性(您所追求的)是否是可枚举的,以及它们具有 non-numeric 名称的属性是否是可枚举的(!),取决于 DOM 实现。这解释了浏览器之间的差异。始终在此处使用(C 风格)for 语句。

    改为:

    <script type="text/javascript">
      function toggleAll(source)
      {
        var checked = source.checked;
        var checkboxes = source.form.elements[source.name];
    
        for (var i = checkboxes.length; i--;)
        {
          var checkbox = checkboxes[i];
          if (checkbox != source)
          {
            checkbox.checked = checked;
          }
        }
      }
    </script>
    
    …
    
    <form …>
      <table …>
    <?php
      foreach (… as $product_option)
      {
        /* DRY */
        $id = $product_option['id'];
    ?>
        <tr>
          <td><input type="checkbox" name="products-quote[]"
                     value="<?php echo $id; ?>"></td>
          <td><input type="checkbox" name="products-sample[]"
                     value="<?php echo $id; ?>"></td>
        </tr>
    <?php
      }
    ?>
        <tr>
          <td><input type="checkbox" name="products-quote[]" value="0"
                     onclick="toggleAll(this)"></td>
          <td><input type="checkbox" name="products-sample[]" value="0"
                     onclick="toggleAll(this)"></td>
          <td>Select all</td>
        </tr>
      </table>
    </form>
    

    在这种情况下未经测试,但通常被证明。我已经删除了显示属性和元素,以便您可以更清楚地看到解决方案。您应该使用基于CSS 的格式替换它们。

    您可能还想考虑为切换复选框赋予不同的名称(这样您就不必在客户端迭代和服务器端处理中排除它们),并将复选框组名称作为第二个字符串参数传递到toggle(…)

    【讨论】:

      【解决方案3】:

      使用索引可能是最有效的方法。因为,当我试图枚举名为 checkboxes 的对象时(像你一样),似乎在不同的浏览器中存储了许多不同的对象。
      所以,尝试使用一个循环直到 checkboxes 的长度并对其进行迭代。

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

      【讨论】:

      • getElementsByName() 效率相对较低且不兼容。请改用集合,它们就是因为这个原因才存在的。
      • @PointerdEars 这不是投反对票的理由——对于一个典型的页面来说,这几乎是不引人注意的。
      • @Kul-Tigin 请注意,您应该在 for 循环之前缓存 checkboxs.length : var i = checkboxes.length;在常规循环中差异不大,但在大循环中有所不同
      • @alonisser 尝试 jsperf 并进行计算。
      • @alonisser 打算自己建立一个 jsperf 测试用例。但是,更重要的一点是:它不可靠。 UA可能不支持;集合可以追溯到 NN3/IE3。名称可以在任何地方使用,不仅用于表单控件。可能有命名空间。谈谈 MSHTML 的名称/ID 混淆。我可以继续说下去,但我认为我的观点是正确的。
      【解决方案4】:

      更多帮助和最佳实践: 而不是元标记 tou 正在使用,您可以通过以下元标记强制 IE 使用他的边缘渲染引擎(字符集只是为了与当前代码兼容)

      <meta charset="windows-1252" /> why are using this encoding instead of utf-8?
      
      <meta http-equiv="X-UA-Compatible"  content="IT=edge,chrome=IE8"> 
      

      请注意,实际上并不需要添加 chrome=IE8,但如果您遇到使用 ie8 或更低版本且安装了 chorme 框架的用户,它将使用 chrome 高级渲染引擎而不是 ie8

      (顺便说一句,您也可以提示他们安装 google frame-但这不在主题范围内)

      根据我的经验,这个 hack 解决了很多神秘的 IE8 问题。

      其他几个小问题: 1.您正在使用 language=javascript - 您不再需要它了.. 更好地使用 type=text/javascript (今天也几乎不需要,可能与咖啡脚本等的兴起有关)

      2.脚本包含在表格中!为什么?最好包含在头部,甚至更好(为了性能)在正文部分的底部使用 $(document).ready 函数,或者在底部使用 $.ready 更好,并从不同的 js 文件中调用以将 js 与html 的其余部分。

      现在更重要的部分 - 你已经在你的页面中调用了 jQuery - 让它完成繁重的工作! Jquery 已经针对浏览器间的兼容性、性能等进行了优化,使用起来也更加简单:

      您可以在没有“onclick”的情况下绑定切换事件,例如:为复选框按钮添加一个“selectAll”类。

      现在是脚本:

          $(document).ready(function(){
              $(".selectAll").click(function(){
                var b = $(this);
                if (b.checked){
                    $('form input:checkbox [name=b.name]').each(function(i){
                      this.prop("checked",true);
                    });
                }
               });
      
         });
      
      • 我知道这不是最优化的选择器..但这不是他现在的问题。

      编辑:似乎我在代码中犯了一些错误 - 已修复!并且像魅力一样工作

      【讨论】:

      • 与 DOM 已经提供的相比,jQuery 在内部 膨胀。这里没有“浏览器差异”可以解决。
      • 你完全没有抓住重点!他已经在他的页面中使用 jquery 了!对于不同的东西,插件等不要说教,而且由于他已经在使用 jquery 来处理其他事情,所以使用普通的 javascript 要短得多。我也拒绝 jQuery 是一种过时的废话 - 占用空间非常小,选择器优化到边缘(如果可用,在幕后默认为浏览器 DOM 选择器),是的 - 跨浏览器很重要 - 看 - 这就是这里的问题 -跨浏览器问题!
      • @alanisser 去调试 jQuery 并惊讶它实际上是多么的臃肿。去 jsPerf 它:Sizzle is slowComparison of popular selector engines vs. native approach。不,它不是根本上是一个跨浏览器问题,它只是被认为是一个问题,因为首先是错误的方法。您只是不使用 document.getElementsByName() 来访问表单控件。 DOM 101,真的。
      【解决方案5】:

      尝试使用“getElementsByTagName”而不是“getElementsByName”。 getElementsByName 在 IE 中不起作用。

      【讨论】:

      • 你是怎么想到这个主意的? getElementsByName() 至少在 IE/MSHTML 6.0.2800.1106 中有效。这不是失败的原因。请参阅我的其他答案。
      猜你喜欢
      • 2013-04-26
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      相关资源
      最近更新 更多