【问题标题】:jQuery .toggle() not working with TRs in IEjQuery .toggle() 不适用于 IE 中的 TRs
【发布时间】:2009-06-10 11:58:24
【问题描述】:

我正在使用 jQuery 的 toggle() 来显示/隐藏表格行。它在 FireFox 中运行良好,但在 IE 8 中无法运行。

.show()/.hide() 工作正常。

slideToggle() 在 IE 中也不起作用 - 它会显示片刻然后再次消失。在 FireFox 中运行良好。

我的 HTML 看起来与此类似

<a id="readOnlyRowsToggle">Click</a>  
<table>  
  <tr><td>row</td></tr>  
  <tr><td>row</td></tr>  
  <tr class="readOnlyRow"><td>row</td></tr>  
  <tr class="readOnlyRow"><td>row</td></tr>  
  <tr class="readOnlyRow"><td>row</td></tr>  
</table>

JavaScript

$(document).ready(function() {  
    $(".readOnlyRow").hide();  
    $("#readOnlyRowsToggle").click(function() {  
        $(".readOnlyRow").toggle();  
    });  
});  

【问题讨论】:

  • 在 IE8 中与 TD:s 相同的问题。

标签: jquery html toggle


【解决方案1】:

我在表格中的 tr 上也遇到过同样的错误。我使用 IE8 的脚本调试工具做了一些调查。

首先我尝试使用切换:

$(classname).toggle();

这适用于 FF 但不适用于 IE8。

然后我尝试了这个:

if($(classname).is(":visible"))//IE8 always evaluates to true.
     $(classname).hide();
else
     $(classname).show();

当我调试这段代码时,jquery 一直认为它是可见的。所以它会关闭它,但它永远不会打开它。

然后我把它改成这样:

var elem = $(classname)[0];
if(elem.style.display == 'none')
     $(classname).show();
else
{
     $(classname).hide();               
}

效果很好。 jQuery 中有a bug 或者我的html 有点古怪。不管怎样,这解决了我的问题。

【讨论】:

  • 爱它。我也发现了这个错误,这个建议在几秒钟内解决了我的问题。很多谢谢。
  • 谢谢老兄。另一集“StackOverflow 挽救了我的工作!”
  • elem.style.display 应该是 elem.css('display')
  • 这行好像是:var elem = $(classname)[0];将函数限制为仅使用该类名切换第一个元素 [0]。如果您想要同时切换几个页面元素怎么办?如何让所有元素正确切换?
  • @Jen: $(classname)[0] 不仅切换第一个元素,它只是检查所有选定元素中的第一个是可见还是隐藏。基于该元素,所有选定的元素(包括第一个元素)都将显示或隐藏。
【解决方案2】:

升级到 jQuery 1.4 解决了这个问题,虽然我正在这样做,但这个页面上唯一对我有用的“修复”是 Dough boy 的回答:

$(document).ready(function() {  
  $(".readOnlyRow").hide();  
  $("#readOnlyRowsToggle").click(function() {  
    $(".readOnlyRow").toggle($('.readOnlyRow').css('display') == 'none');  
  });  
});

【讨论】:

  • 我已经阅读了关于 jQuery 的 .toggle() 的文档...我仍然不明白上面的切换代码是如何工作的。你/有人能解释一下吗?
  • 没关系,我现在看到了使用布尔值调用的文档:.toggle(showOrHide)
【解决方案3】:

从您的&lt;tr class=".readOnlyRow"&gt;&lt;td&gt;row&lt;/td&gt;&lt;/tr&gt; 中删除句点。 jQuery 类选择的语法是在它前面加上一个句点,但你的 HTML 代码中不需要它。

【讨论】:

  • 很好发现,但不幸的是不是原因。这是我重新输入问题造成的。我已经解决了这个问题,但问题仍然存在。
  • 您是否尝试过简单地使用 display:none 为您的 .readOnlyRow 类定义一些 CSS?然后,您可以切换 CSS 类 (toggleClass) 而不是让 jQuery 找出可见性切换。
【解决方案4】:

我发现虽然这在 IE8 中不起作用

$('.tableRowToToggle').toggle();

但这确实有效:

$('.tableRowToToggle').each(function(){this.toggle()});

从之前发布的链接 jAST 中得到这个想法

【讨论】:

    【解决方案5】:

    我通过隐藏 TR 元素的子元素解决了这个问题。

    toggleTr($(".toggletr"));
    
    function toggleTr(el) {
        $(el).children('td').each(function() {
            $(this).toggle();
        });
    }
    

    这对于 FF3.5/FF3/IE8/IE7/IE6/Chrome/Safari 来说似乎没问题。

    【讨论】:

      【解决方案6】:

      我自己也遇到过这个问题——我找到的最简单的解决方案是检查:

      :not(:隐藏)

      而不是

      :可见

      然后采取相应的行动。 .

      【讨论】:

      • 在这里改变了 IE8。谢谢!
      【解决方案7】:

      看起来这已在 JQuery 1.4 中得到修复。

      【讨论】:

      • 我使用的是 1.4.2,但似乎仍然存在问题。
      • 我使用的是 1.7.1,但问题仍然存在
      【解决方案8】:

      表格是一段有趣的 html,它们不像其他元素那样遵循常规规则。

      基本上表格显示为表格,表格有特殊规则,但由于浏览器大战的疯狂过山车,这在旧版浏览器中没有得到妥善处理。

      基本上在旧版浏览器中,表格显示属性很少,并且流程基本上没有记录,因此最好不要更改 table/tr/td 标记的预定义值,而是添加和删除以下类并简单地切换类本身表/tr/td 属性的 on 和 off。

      .tableHide {
          display: none;
      }
      
      <table>
      <tr><td> Visible content</td></tr>
      <tr><td> Visible content</td> <td class="**tableHide**"> **Hidden Content**</td></tr>
      </table>
      

      这样做的原因是它是一个单独的类,用于切换显示,因此表格本身没有任何更改,也不需要更改任何表格属性,显示和任何相关的布局属性都被保留即使浏览器在幕后并不那么容易。

      【讨论】:

        【解决方案9】:
        $(document).ready(function() {  
            $(".readOnlyRow").hide();  
            $("#readOnlyRowsToggle").click(function() {  
                $(".readOnlyRow").toggle($('.readOnlyRow').css('display') == 'none');  
            });  
        });
        

        有一个 jQuery 错误,IE8 会导致所有内容都评估为 true。上面试试

        【讨论】:

          【解决方案10】:

          我遇到了同样的问题,但我找到了一个很好的解决方法,可以让 toggle/slideToggle 在所有浏览器中工作。

          <a id="myButton">Click</a>
          <div id="myDiv" display="none">lorem ipsum .... text ....</div>  
          

          现在是 JS:

              jQuery("#myButton").click(function () {
            var currentDisplay = jQuery("#myDiv").css("display"); // save the current Display value
            jQuery(#myDiv).slideToggle("fast", function () { // lets do a nice slideToggle
              // this code will run AFTER the sildeToggle is done
              // so if slideToggle worked fine (in FF, chrome, ...) this will have no evect, since the value is already block or none
              // but in case IE 8 runs this script, it will set the css display to the current value
              if (currentDisplay == "none") {
                jQuery(#myDiv).css('display', 'block');
              }else {
                jQuery(#myDiv).css('display', 'none');
                  }
              });
              return false;
          });
          

          结果是slideToggle 在所有浏览器中都可以正常工作,除了 IE8,在其中看起来很奇怪(混乱的幻灯片),但它仍然可以工作。

          【讨论】:

            【解决方案11】:

            我注意到,如果您包含 jquery mobile,则切换可能不适用于 iphone。如果您在加载 jquery mobile 之前运行切换 (.ready) 则很好。

            【讨论】:

              【解决方案12】:

              因为您让他们点击&lt;a&gt;,所以您需要该函数返回 false。

              【讨论】:

              • -1:一点也不。我可以在点击中添加任何我想要的东西,它可以工作,而不是切换
              【解决方案13】:

              我也注意到了这一点。可能您必须在每个 td 上切换一个类。还没有尝试过这个解决方案,所以请告诉我!

              对于其他 - 这是特定于 IE8,而不是 6 或 7。

              编辑

              很明显,您没有像-1 所证明的那样尝试这个,就像我刚刚做了很好的结果(在我的情况下)。

              CSS

              tr.hideme td { 显示:无 }

              JS

              $("#view-advanced").click(function() {
                  $("tr.hideme td").toggle();
                  return false;
              });
              

              【讨论】:

              • 在 td 上放置 toggle() 会产生不同的结果:它会切换某些单元格,而其他单元格不会,但在切换的内容/方式上并不一致。我怀疑将它放在 td 上时可能会出现万圣节问题。有趣的是,它在 FF 上运行良好,而 td 上的 show()/hide() 在 IE8 和 FF 上运行良好。
              • 在我的第一个测试中,我实际上从 tr 中删除了该类并将其放在 TD 上,这就是我得到奇怪结果的地方。我现在尝试按照您在编辑中建议的方式(不包括 CSS)更改它(即更改选择器),并且该选择器在 FF 或 IE8 中都不起作用。我还尝试了以下选择器组合,但这些组合也不起作用: tr.readOnlyRow > td .readOnlyRow > td .readOnlyRow td 然后我尝试将隐藏函数更改为 CSS 并最终遇到与以前相同的奇怪问题。
              • 不确定它对你不起作用 - 在 IE6 - 8、FF3、Safari 中对我来说很好。
              • 你们各自使用哪个版本的jQuery?
              猜你喜欢
              • 1970-01-01
              • 2019-10-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-05-17
              相关资源
              最近更新 更多