当前位置:嗨网首页>书籍在线阅读

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>

正如你所看到的,这种情况下不需要轮询。如果你不需要过多使用或者打算给页面添加很多脚本,这是个可行的解决方案。