jQuery show/fadeIn 不将 display:block 应用于隐藏的父元素内的子元素 - 仅限 FireFox

Posted

技术标签:

【中文标题】jQuery show/fadeIn 不将 display:block 应用于隐藏的父元素内的子元素 - 仅限 FireFox【英文标题】:jQuery show/fadeIn Does not apply display:block to a child element inside a hidden parent element - FireFox ONLY 【发布时间】:2013-12-27 01:12:47 【问题描述】:

问题:仅限 FireFox。

在页面加载时,我有一个隐藏的 iFrame(我不控制父页面)。在这个 iFrame 中,我有基于状态隐藏/显示的元素,并使用 jQuery show()/fadeIn() 来处理这个问题。

当 iFrame 在页面加载时隐藏(它总是隐藏)时,display:blockdisplay:inline-block 不会应用于这些元素。如果 iFrame 在页面加载时可见,则正确处理子元素并分配 display:block

我意识到我可以通过简单地使用$el.css('display', 'block') 来解决这个问题,但我想了解问题的根源并正确解决它,并发现这是否是一个 jQuery 错误。为什么jQuery不显示基于父元素的元素,为什么这个只有 FireFox(Gecko渲染引擎)?

预期结果: 无论父 (iFrame) 的可见性或显示如何,在使用 $el.show() 时子元素都应更新为可见状态(当然,在父元素显示之前保持隐藏状态)。

我已经进行了广泛的搜索以寻找可靠的答案,但是所有论坛都没有解决或答案而结束,而是使用了解决方法。

有人见过和/或解决过这个问题吗?

谢谢!

更新

在创建小提琴时,我想到了一个解决方案。我不是 100% 肯定 iFrame 幕后发生的事情,但现在看到了一个模式。似乎加载事件没有在 iFrame 内触发。

家长小提琴:http://jsfiddle.net/kaizen5/BxkxB/

iFrame Fiddle:http://jsfiddle.net/pQqXc/(此页面上有一个容器在加载时可见)

您会注意到,当您首先单击 ('bad') 按钮时,它会显示 iFrame 并且 fiddle 似乎是空的。这是因为 Fiddle iFrame 在加载时调用了一个函数,该函数应该显示 fiddle 的内容。这模仿了我在自己的解决方案中看到的问题。

“好”按钮显示 iFrame 并(重新)分配“src”以强制重新呈现页面。这一次,加载事件触发就好了。

【问题讨论】:

您能否提供指向您页面的链接?或者,最好是一个简化版本的链接(只显示问题,没有别的)?您的问题现在包含太多未知数... iframe 是如何隐藏的;如果它总是隐藏的,你为什么要关心它的内容是什么样的等等。 我的意思是,我制作了a fiddle,它只是表明它在所有浏览器中都有效,所以你的情况与此不同。 嗨,Lister 先生,很遗憾,我没有什么可以公开分享的。让我试着解释一下。 iFrame 默认是隐藏的。同样,iFrame 中的某些元素也被隐藏了。在 iFrame 页面加载时,我选择性地在 iFrame 中显示这些元素(iFrame 仍处于隐藏状态)。 iFrame 保持隐藏状态,直到发生用户事件。显示 iFrame 时,编程显示的输入不可见。这仅在 FireFox 中以及在使用 jQuery 的 show() 或 fadeIn() 时。 你能做一个小提琴或任何显示问题的东西吗?在重新阅读时,我意识到我不知道show() 调用是在哪里以及如何完成的。在 iframe 内部,元素是否最初隐藏(如果是,那么究竟是如何隐藏的)然后在 onload 中显示?或者它们是否可以从父页面中的调用中看到?如果是这样,什么时候、之前或之后 iframe 可见?此外,iframe 本身是如何隐藏并准确显示的?这些细节很重要。请创建一个小的、独立的、完整的示例,该示例以相同的方式工作并显示相同的问题。 我不会写评论,而是用新信息更新票证。 【参考方案1】:

这实际上不是 Firefox 中 onload/onready 未触发的问题。因为确实如此。

问题在于 show() 函数在这种特殊情况下无法正常工作 - onload 在隐藏时在 iframe 中运行。

$('...').show() 替换为$('...').css('display','inline') 就可以了。

在 Firefox 和 Chrome 中查看这个小提琴组合页面 http://jsfiddle.net/xZdLx/4/ 和 iframe http://jsfiddle.net/L3Lxn/10/。

确实是一个非常奇怪的错误,无论是 jQuery 还是 Firefox 中的错误,而且是一个很好的发现。

解决方法

正如您自己发现的那样,如果您首先显示 iframe,然后通过更新 iframe 的 src-attribute 强制 Firefox 重新加载页面,show() 将起作用。

【讨论】:

以上是关于jQuery show/fadeIn 不将 display:block 应用于隐藏的父元素内的子元素 - 仅限 FireFox的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Ajax 不将数组作为数据对象发送

使用 jQuery 并排动画两个 DIV,而不将另一个推到底部

使用 AJAX 和 jQuery 验证 From 而不将数据发送到另一个文件

如何在不将页面滚动条重置为顶部的情况下使用 jQuery 为固定 div 设置动画

ajax GET类型不将数据传递给烧瓶

jquery easyui ,一个window中创建了datagrid,第一次弹出窗口可以显示出数据,