jQuery:show()不断添加display:block

6

我现在遇到了一个小问题,它已经变成了一个恶化的伤口。

我重新创建了Google营业时间设置,用于设置公司在一周内开放的时间或当天是否关闭。现在,如果他们关闭了,用户可以选择复选框,然后时间DIV就会隐藏。现在我正在使用.show().hide()

现在,假设用户关闭了第一天并决定“应用所有”到本周的其余日子。我循环关闭剩下的6天。但是,如果用户在本周中间修改了一天,那么.show().hide()函数会自动添加"display:block",这会破坏循环。

为什么jQuery会在原来不存在的情况下添加这个样式,是否有一种干净的方法可以在循环之前删除它,然后再应用.show().hide()


2
我不明白它是如何打破循环的。jQuery使用display:nonedisplay:block来隐藏和显示元素,如果没有预设CSS属性来确定它们最初的显示方式。------一些示例代码可能有助于澄清问题。 - Peter Ajtai
它并不是传统意义上的中断循环。该循环只是用于添加或删除“隐藏”类。.show()和.hide()手动添加显示属性,这会有效地干扰循环。我将手动添加/删除类,而不是使用.show。吸取了教训。 - dcolumbus
5个回答

6
在未定义显示方式的元素上,JQUERY在取消隐藏后会向元素添加display:block。
之后您可以将其删除。
$("#myrow").show().removeAttr( 'style' )

这包括所有动态样式,如果您依赖于此,请注意。

4

如果您对show()和hide()的效果不满意,可以使用jQuery的addClass()和removeClass(),并附加一个类来更改可见性,例如。


除非他不使用该效果,否则他将失去动画并必须重新创建它们。 - jcolebrand
在这种情况下,不需要动画效果。 .show() 和 .hide() 效果会自动注入一个显示…我不想要那个。所以我决定忽略它,只是手动添加或删除一个“隐藏”类。 - dcolumbus
虽然在许多情况下这是最好的选择,但我最终还是采用了以下方法: $(this).css("display", ""); 以消除注入的 display:block。 - Simply G.

2
Jquery使用"display:none"来隐藏hide()。我经常使用这个方法和show(),但是由于display:block没有影响我的格式,所以我还没有遇到任何问题。
以下是您的解决方案:
$("#mydiv").show().css("display","inline")

使用你想要的div设置代替inline(虽然inline可能适用于你,但考虑到block不是)。


你应该将这些操作顺序调换,使得在 .show() 方法执行前 CSS 已经设置好了,这样就不必再次设置了。或者更好的做法是,定义 #mydiv 的 CSS 样式为 display:inline,这样在 jQuery 开始工作之前就已经具备了初始值。 - jcolebrand
我尝试了这种方法。这是我做的第一件事...它并不完全按照那种方式运作。但是,理论上,如果我将来决定再次使用.show,我一定会从一开始就定义我想要的显示。 - dcolumbus

2

http://api.jquery.com/show/

匹配的元素将立即显示,没有动画效果。这与调用.css('display', 'block')大致相同,除了显示属性被恢复为其最初的值。如果一个元素的显示值为内联,则隐藏并显示后,它将再次以内联方式显示。

您是否设置了原始CSS显示属性?


0

像Cyril Gupta和Jimmy Kane的回答一样,在一个隐藏的div中使用这个:

$("#hiddenDiv").css("display","");

这只是清除了"display:none",你的样式表应该接管后续操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接