Page 29 - JavaScript修炼之道
P. 29

16       第二部分  DOM、事件及定时器


             任务 7 在 DOM 加载完成后运行脚本


                 为了使你的页面在一开始就能给出正确的响应,你的脚本应该在页面DOM加载完成后尽快
             得到执行。

                 如果你使用window的load事件,你的脚本就得等到所有资源(包括样式表、图片以及Google
             Analytics 跟踪器之类的加载时间很长的脚本)加载完成之后才能被执行。而这往往会使页面得
                     ①
             不到及时的渲染。

                 所有的JavaScript库都在这方面下足了功夫,它们的处理方法很相似:以自定义方法或是自定
             义事件(比如Prototype、MooTools和YUI3)的形式提供了一个触发器,你只需把要执行的脚本
             写到一个函数里,再把这个函数指派到这个触发器上就可以了。

                 顺便提一个良好实践:如果你的UI部分依赖于JavaScript,那你就应该把非JavaScript相关的
             UI设置为默认可见,而把JavaScript相关的UI设置为隐藏。等DOM加载的事件发生之后,你只需
             把JavaScript相关的部分添加到文档中,然后利用CSS切换其可见性。由于这样可以避免页面载入
             中的UI闪烁,因此它比直接使用JavaScript来隐藏无关UI要好很多。

                 现在举一个相当有技巧的例子:假设你的初始化代码位于某处的实例方法中,为确保实例方
             法内部的this指向正确的实例,需要保持方法与原来实例的绑定关系。多数库提供了常规方法绑
             定的方式(比如Prototype中的bind())来实现它,而Dojo和Ext JS在这方面走得更远,它们允许
             你为方法的实例提供一个显式的引用。也就是说,它们可以直接在合适的上下文中调用方法:


                 // Dojo
                 dojo.addOnLoad(binding, fx)
                 // Ext JS
                 Ext.onReady(fx, binding)
                 你也应该去检查你的初始化代码是否真的在DOM加载时执行;在少数情况下,一些代码会
             过早执行。举例来说,你可能需要等待某幅图像载入完成,以便根据它们的尺寸来设置UI;与此
             类似,你可能需要等待某个CSS样式表加载完毕,以便设置元素的尺寸、颜色等属性。在这种情
             况下,你有可能要使用window的load事件。不过,在大多数情况下,DOM加载事件已经够用了。






             ——————————
                ① Google Analytics是Google为网站提供的数据统计服务。可以对目标网站进行访问数据统计和分析,并提供多种参
                  数供网站拥有者使用。*
   24   25   26   27   28   29   30   31   32   33   34