jQuery .toggle()不使用IE中的TRS
题
我正在使用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();
});
});
解决方案
我在表格中的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得到了 一个错误 在其中,或者我的html有点棘手。无论哪种方式,这都解决了我的问题。
其他提示
升级到jQuery 1.4修复了此问题,尽管我这样做了,此页面上唯一对我有用的“修复程序”是面团男孩的答案:
$(document).ready(function() {
$(".readOnlyRow").hide();
$("#readOnlyRowsToggle").click(function() {
$(".readOnlyRow").toggle($('.readOnlyRow').css('display') == 'none');
});
});
从您的期间中删除 <tr class=".readOnlyRow"><td>row</td></tr>
. 。 jQuery类选择的语法是用一个段进行预处理,但是您在HTML代码中不需要它。
我发现虽然这在IE8中不起作用
$('.tableRowToToggle').toggle();
但这确实有效:
$('.tableRowToToggle').each(function(){this.toggle()});
从此处发布的链接jast中获取了这个想法
我通过隐藏TR元素的孩子来解决这个问题。
toggleTr($(".toggletr"));
function toggleTr(el) {
$(el).children('td').each(function() {
$(this).toggle();
});
}
对于FF3.5/FF3/IE8/IE7/IE6/Chrome/Safari来说,这似乎还可以。
我自己刚遇到这个 - 我发现最简单的解决方案是检查:
:不(:隐藏)
代替
:可见的
然后采取相应的行动。 。
看起来这是在JQuery 1.4中固定的。
表是HTML有趣的一部分,它们不遵循正常规则作为其他元素。
基本上表现出表作为桌子,有一些特殊的桌子规则,但由于疯狂的过山车是浏览器战争,因此在较旧的浏览器中没有正确处理。
从本质上讲,在较旧的浏览器表中,显示属性是最小的,并且该流量的大部分未记录在很大程度上,因此,而不是更改表/tr/td标签的预定义值,而是最好添加和删除以下类,然后简单地打开和关闭类本身。在表/tr/td的属性上。
.tableHide {
display: none;
}
<table>
<tr><td> Visible content</td></tr>
<tr><td> Visible content</td> <td class="**tableHide**"> **Hidden Content**</td></tr>
</table>
这样做的原因是,它是一个单独的类来切换显示屏,因此表上没有任何内容,也不需要更改任何表属性,显示以及保留任何相关的布局属性,即使浏览器在幕后并不容易。
$(document).ready(function() {
$(".readOnlyRow").hide();
$("#readOnlyRowsToggle").click(function() {
$(".readOnlyRow").toggle($('.readOnlyRow').css('display') == 'none');
});
});
有一个jQuery错误,IE8会导致所有内容进行评估。上面尝试
我遇到了同样的问题,但是我找到了一个很好的解决方法 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外,所有浏览器都可以正常工作,其中看起来很奇怪(弄乱的幻灯片),但仍然可以正常工作。
我注意到,如果您包括jQuery手机,则切换可能对iPhone不起作用。如果您在加载jQuery移动设备之前运行toggle(.dready),则可以很好。
因为你让他们点击 <a>
, ,您需要函数返回false。
我也注意到了这一点。您可能必须改用每个TD上的类。还没有尝试过这种解决方案,所以请告诉我!
对于其他人 - 这是特定于IE8的,而不是6或7。
编辑
显然,您没有尝试过-1所证明的那样,就像我刚刚取得的好成绩一样(在我的情况下)。
CSS
tr.hideme td {display:none}
JS
$("#view-advanced").click(function() {
$("tr.hideme td").toggle();
return false;
});