26-讨论
8.6.3 讨论
1.马上隐藏元素(或者其他样式操作)
你的问题和样式直接相关,你希望为元素应用一个条件样式,这个条件必须由JavaScript求值。
正确的方法是为很快可以访问的元素(如 <html> 元素)添加一个特定的CSS类,然后相应地设置元素的样式。
代码如下:
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html.no-message #message{ display:none; }
</style>
<script src="assets/jquery-latest.js"></script>
<script type="text/javascript">
//不好的做法
jQuery(document).ready(function($){
$('#message').hide();
});
// 正确的做法
jQuery('html').addClass('no-message');
//也可以这么做
document.documentElement.className = 'no-message';
</script>
</head>
<body>
<p id="message">I should not be visible</p>
<!--
Many more html elements
-->
</body>
</html>
2.尽快为元素ASAP绑定一个事件处理程序
我们很经常会有一个大型的页面,上面有按钮和链接之类的交互式元素。
你不希望这些元素在页面加载的时候只是挂在那里,而没有任何附加的功能。
幸运的是,“事件委托”这一杰出概念能够解决这个问题。事件委托可以用多个jQuery插件轻松实现,而且从jQuery 1.3版本开始,不再需要插件,因为这个功能已经添加到核心jQuery文件中。
现在,可以使用 live() 方法为还不存在的元素绑定实践处理器[4]。这样,不需要等到元素就绪之后才能添加事件。
事件委托的更多知识参阅秘诀8.10。
3.任何其他情况
你的问题与样式或者事件无关。那么我的朋友,你遇到了最糟糕的情况。
但是不要惊慌!如果你关心性能,有比轮询更好的解决方案。我将在最后加以说明。
轮询 。轮询可以通过在一个简单的时间间隔( setInterval )内检查元素来实现,一旦发现元素,就运行某个函数并清除时间间隔。
有两个插件可以帮助你完成轮询。其中之一是 LiveQuery ,[5]它有一个选项,能够注册一个对匹配选择器的新发现元素运行的函数。这种方法相当慢,但是支持整个选择器集。
另一个插件名为 ElementReady<sup class="my_markdown">#</sup> ,[6]该插件也能正常地处理这种情况。
ElementReady<sup class="my_markdown">#</sup> 让你注册一对 id/function ,然后它轮询DOM。一旦发现 id ,就调用该 function ,并从队列中删除 id 。
这个插件实现的可能是检测元素的最快方法,也就是使用 document.getElementById ,这个插件运行速度相当快,但是只支持 id 。
自定义位置的脚本 。文档就绪的完整概念是“HTML解析之后”。这意味着浏览器已经到达文档正文的结束标记 </body> 。
换句话说,可以将脚本放在 </body> 之后,代替使用 document.ready 。
你可以对DOM的其他部分应用相同的原则:你可以在想要访问的元素后面添加一个 <script> 标记,无疑,这样你就能知道已经可以访问该元素。
下面是一个例子:
<!DOCTYPE html>
<html>
<head>
<script src="assets/jquery-latest.js"></script>
</head>
<body>
<p>The time is <span id="time"> </span></p>
<script type="text/javascript">
jQuery('#time').text( new Date().toString() );
</script>
<!-- Many more html elements -->
</body>
</html>
正如你所看到的,这种情况下不需要轮询。如果你不需要过多使用或者打算给页面添加很多脚本,这是个可行的解决方案。