display: none
[..],如果使用非内联 CSS将元素声明为不可见(),Prototype 将不允许将元素切换为可见。这是我一直不理解并且经常被激怒的东西。任何可以提供任何见解的人都会得到我的大力支持。
您可能已经看到了这一点,但是 eg 的文档show
(还有其他具有相同注释的相关函数)指出:
Element.show
无法显示通过 CSS 样式表隐藏的元素。请注意,这不是原型限制,而是 CSSdisplay
属性如何工作的结果。
所以,这是一个已知的问题,他们责怪 CSS。但是,请考虑以下文档(我之前没有使用过 Prototype,所以我不确定这是否是等待 DOM 加载的推荐方式,但它似乎有效):
<!doctype html>
<script src="prototype.js"></script>
<script>
document.observe("dom:loaded", function() {
$("victim").show();
});
</script>
<style>
p#victim {display:none;}
</style>
<p id="victim">Hello world!
正如您已经知道的那样,这是行不通的。为什么?display
好吧,当您告诉自己时,Prototype 怎么知道将属性p#victim
“重置”show
为什么?(换句话说:display
如果display: none
没有在规则集中使用p#victim
选择器,它如何找出应该是什么值。)答案很简单:它不能。(想一想。如果另一个规则集使用选择器修改我们的规则集中不存在的值怎么display
办?(即我们不能假设 eg always 应该设置为,其他规则集可能已更改该值。)我们无法删除display: none
p#victim
p
block
display
样式表中规则集的属性,我们不能删除元素和规则集之间的整个连接,因为它可能包含其他属性等等(即使有可能,恕我直言,不明显找到使用哪个规则集执行此操作)。当然,我们可以继续这样做,但是 afaik 这个问题没有已知的解决方案。)
那么为什么内联替代方案有效呢?首先,让我们看看是如何show
实现的:
show: function(element) {
element = $(element);
element.style.display = ''; // <-- the important line
return element;
}
这个函数唯一重要的事情就是设置element.style.display
一个空字符串 ( ''
),它display
从style
. 伟大的!但是,这是什么意思?为什么我们要删除它?!首先,我们必须找出element.style
当我们修改它的值时实际代表和修改了什么。
MDC 文档element.style
说明:
返回一个表示元素style
属性的对象。
注意最后一个词:属性。element.style
≠ 元素的当前“计算”样式,它只是属性中的style
属性列表(请参阅 MDC 以获得更长/更好的解释)。
考虑以下文档:
<!doctype html>
<script src="prototype.js"></script>
<script>
document.observe("dom:loaded", function() {
$("victim").show();
});
</script>
<p id="victim" style="display:none;">Hello world!
style="display:none;"
隐藏p#victim
,但是当 DOM 完成加载时,Prototype 会将其更改为style=""
,并且浏览器将重新计算该display
属性的值(在这种情况下,该值来自浏览器的默认样式表)。
但是,请考虑以下文档:
<!doctype html>
<script src="jquery.js"></script>
<script>
$(document).ready(function(){
$("#victim").show();
});
</script>
<style>
p#victim {display:none;}
</style>
<p id="victim">Hello world!
jQuery 正确地处理样式表的东西,在这种情况下无论如何!这不像 Prototype 解决方案那样容易解释,而且我现在需要阅读许多令人敬畏的层面,并且在很多情况下 jQuery 无法计算出正确的display
. (最后一个提示:Firebug ...,但我猜它使用了一些 Firefox 独有的东西或其他东西。)