1.每个<script>加载时都会阻塞其他文件(图片、音乐等)的同时加载,同时浏览器会在js代码执行时停止渲染Dom.所以为了减少界面加载的卡顿和空白发生,应尽力将js代码或者文件放在</body>前,防止js代码影响Dom渲染。

2.js文件现在浏览器内部已经实现并行加载。提高浏览器加载js性能:a.减小js大小 b.减少内链代码个数 3.http请求会带来额外开销,所以1个100K的js加载时间短语4个25k的。

3.页面无阻塞:考虑在页面框架加载渲染完之后再触发对脚本的下载

window.onload()

可以在<script>标签内加入defer:

  1. <script src=”index.js” defer></script>

,向浏览器提前说明:本js文件无对dom操作,可以延迟加载执行。目前所有浏览器都已实现.

4.script标签也是Dom对象,所以可以动态添加js脚本。

  1. var script=document.cresteElement(“script”);
  2. script.type = text/javascript”;
  3. script.scr= 123.js”;
  4. document.getElementByTagName(“head”)[0].appendChild(script);

可以添加加载完成时的状态:

  1. script.onload = function(){ //除IE外,支持
  2. alert(‘动态js加载完成’);
  3. };
  4. script.onreadystatechange = function(){//IE
  5. //其中readyState 为识别值,有5种取值结果:
  6. // unintialized初始状态 loading下载中 loaded下载完成 interactive 数据完、、 //成下载但不可用 complete 所有数据已经准备完成
  7.  
  8. if(script.readyState ==”loaded || script.readyState ==”complete”){
  9. //…………
  10. }
  11. }
  12. }

但是,如何将两种浏览器加载识别模式融合在一起?

  1. function loadScript (url,callback){//url为文件位置,callback为回调函数
  2. var script = document.createElement(“script”);
  3. script.type=”text/javascript”;
  4. script.src=”index.js”;
  5. if(script.readyState){ //ie
  6. script.onreadystatechange = function(){
  7. if(script.readyState ==”loaded || script.readyState ==”complete”){
  8. callback();
  9. }
  10. }
  11. else{ //其他浏览器
  12. script.onload = function(){
  13. callback();
  14. }
  15. }
  16. script.scr= url;
  17. document.getElementByTagName(“head”)[0].appendChild(script);
  18. }

上面这种是书上给出的只能加载js的函数,怎么用这个函数同样能css动态加载?  自己改良了一下:

    

  1. function afterload(){
  2. alert("已加载");
  3. }
  4.  
  5. function loadScript(url,type,callback){
  6. if("js"==type){
  7. var script = document.createElement("script");
  8. script.type = "text/javascript";
  9. if(script.readyState){ //ie
  10. script.onreadystatechange = function(){
  11. if(script.readyState ==”loaded || script.readyState ==”complete”){
  12. callback();
  13. }
  14. }
    }
  15. else{ //其他浏览器
  16. script.onload = function(){
  17. callback();
  18. }
  19. }
  20. script.src = url;
  21. document.getElementsByTagName("head")[0].appendChild(script);
  22. }
  23. else if("css"==type){
  24. var css = document.createElement("link");
  25. css.setAttribute("rel","stylesheet");//增加属性函数,css.rel()不存在,所以只能setA...出来
  26. css.setAttribute("type","text/css");
  27. if(css.readyState){ //ie
  28. css.onreadystatechange = function(){
  29. if(css.readyState ==”loaded || css.readyState ==”complete”){
  30. callback();
  31. }
    }
    }
  32. else{ //其他浏览器
  33. css.onload = function(){
  34. callback();
  35. }
  36. }
  37.  
  38. css.setAttribute("href",url);
  39. document.getElementsByTagName("head")[0].appendChild(css);
  40. }
  41. }

5.可以尝试使用YUI或者Lazyload来做无阻塞加载

6.js的事件冒泡

event事件作为对象存在于widow内或者每一个element节点内部,需要通过传参数(或者直接调用IE中:window.event 全局变量)来对event进行操作

event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

事件通常与函数结合使用,函数不会在事件发生前被执行!

常用的event句柄有onclick,onblur,onfocus等等,常用的属性有ScreenX,ScreenY,button等

当页面为页面内某元素节点绑定句柄并为其句柄绑定函数时,因为元素间包含关系,会导致元素不仅触发自身定义的事件,还触发了其外部元素定义的事件

  1. <div id="wrapper" class=“wrapper” style="background-color:red;">
  2. <button>按钮同志</button>
  3. </div>
  4. <script type="text/javascript">
  5. var _wrap = document.getElementById("wrapper");
  6. _wrap.onclick=function(){
  7. console.log("层点击");
  8. }
  9. var _btn = document.getElementsByTagName("button")[0];
  10. _btn.onclick=function(e){
  11. console.log("按钮点击");
  12. e =window.element || e;
  13. e.cancelBubble = true;
  14. }
  15. </script>

上面点击按钮的时候,先触发了按钮自身的点击事件,后又触发了包裹在button外部的div元素的层点击事件。    这样会导致函数莫名被调用或者传参错误

这就是js事件的冒泡

可以通过event的cancelBubble属性(ie和Chrome) 或者调用  stopPropagation()函数  (FF浏览器)  来执行

document.all属性可以用于区分IE 与 FF ,

if(document.all){

  //这是IE

}

else{

  //火狐

}

为了方便以后调用或者团队开发,可以封装stopPropagation()函数

  1. function stopPropagation(e){
  2. e = window.event || e;
  3. if(document.all){
  4. e.cancelBubble = true;
  5. }
  6. else{
  7. e.stopPropagation();
  8. }
  9. }

button.onclick = function(e){

  stopPropagation(e);

  console.log("按钮点击");

}

《高性能javascript》读书笔记的更多相关文章

  1. csapp读书笔记-并发编程

    这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...

  2. CSAPP 读书笔记 - 2.31练习题

    根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x ...

  3. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  4. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  5. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  6. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  7. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  8. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  9. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  10. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

随机推荐

  1. SparkSQL使用之JDBC代码访问Thrift JDBC Server

    启动ThriftJDBCServer: cd $SPARK_HOME/sbin start-thriftserver.sh & 使用jdbc访问ThriftJDBCServer代码段: pac ...

  2. CentOS内核编译

    From: http://blog.csdn.net/lchengcome/article/details/6715591From: http://bbs.chinaunix.net/thread-3 ...

  3. MFC学习 消息钩子使用

    HANDLE h_KeyBoard; //当前进程的钩子, 另外WH_KEYBOARD_LL, 与WH_MOUSE_LL参数时, 是获取的底层的消息, 相当于获取的全局的 g_hKeyBoard = ...

  4. JS入门-慕课网

    javascript是一种弱类型的数据交互语言, ch 1 数据类型 js中有六种数据类型:nunmber.string.boolean.null.undenfined.object原始类型:numb ...

  5. Flask框架学习笔记(API接口管理平台 V1.0)

    今天博主终于完成了API接口管理平台,最后差的就是数据库的维护, 博主这里介绍下平台的设计原理,首先基于python,利用flask的web框架+bootstrap前端框架完成,先阶段完成了前台展示页 ...

  6. 003.ASP.NET MVC集中管理Session

    原文链接:http://www.codeproject.com/Tips/790387/Session-in-ASP-NET-MVC 1.前言 今天有得有失啊,看到这篇,专心记下里面的精华吧 2.一般 ...

  7. Oracle 物化视图创建

    create materialized view MV_XXXXrefresh fast on commitwith rowidenable query rewriteasselect * from ...

  8. EXTJS 密码确认与验证

    extjs 框架是一个非常优秀的前端框架,提供了丰富的功能与炫丽的界面展示,在用 extjs 创建表单时,特别是在注册或修改密码的时候,要对密码进行确认,这里就密码确认一致性验证和大家分享自己的心得与 ...

  9. 学习总结 java基础

  10. rsync 实现实时增量备份

    Rsync + Crontab实现定时文件同步(首次全量+后续增量) 2015-04-14 19:02:11 标签:增量更新 rsync crontab 原创作品,允许转载,转载时请务必以超链接形式标 ...