SlideShare a Scribd company logo
feifeipan
2006
左侧的促销信息
  滚动一下




       右边的广告要
        飘来飘去~
2008

让用户输入城市
简拼就能够匹配




    能提示用户入住
    日期输入正确性
2011

输入城市简拼能
最快匹配出城市




  能让页面第一时间展
  示给用户,并且最快
     加载完毕
角色演变

       性能
            100   ms

       功能


       美化
DOM Scripting

Ajax

UI Thread

JS Loader
DOM in the Browser World

 JS Engine           Dom API   Document

         Bridge (cost)

                                HTML
Javascript               DOM
                                 XML

                                       各浏览器引擎对比
DOM Access and Modification
DOM Access and Modification
           4500


           4000


           3500


           3000
运行时间(ms)




           2500
                              createElement
           2000
                              innerHTML
           1500


           1000


           500


              0
Repaints and Reflow

       Reflow
       • 浏览器使渲染树中受到影响的部分失效
       • 重新构造渲染树




      Repaints
      • 浏览器重新绘制受影响的部分到屏幕中
Repaints and Reflow
Repaints and Reflow

           document
                          1
                              使元素脱离文档流
        div                                   div
  div div div div

                                         2
                    3                        对其运用多重改变
                        把元素带回文档中


                                         div div div div
• function hideElement(){
     隐藏元素                      var ul = document.getElementById('mylist');
                               ul.style.display = "none";
                               ……doSomethingTo_UL();
   {display:none}              ul.style.display = "block";
                        }




                      • function useFragment(){
     文档片段                      var fragment = document.createDocumentFragment();
                               ……doSomethingTo_fragment ();
{document fragment}     }
                               document.getElementById('mylist').appendChild(fragment);




                      • function useCopy(){
                               var old = document.getElementById('mylist');
     创建备份                      var clone = old.cloneNode(true);

{element.cloneNode}
                               ……doSomethingTo_clone ();
                               old.parentNode.replaceChild(clone, old);
                        }
Event Delegation
          window      5
  冒泡
                   document    4


                              html    3
到达目标

                                     body   2


捕获(非IE)                                     div   1
DOM Scripting
function domAM(){
  var newD = document.createElement(“div”);

    var newDChildren = newD.childNodes;

    var newDSomeChildren = newD.getElementById(“menu”).getElementsByTagName(“a”);
}


function domAM_new(){
  var newD = existD.cloneNode(true);

    var newDChild = newD.children;

    var newDSomChildren = newD.querySelectorAll(“#menu a”);
}
DOM Scripting
function domAM(){
  var divs = document. getElementsByTagName(“div”);
  for(var i = 0; i < divs.length; i++){
   document.body.appendChild(document.createElement(‘div’));

    document.getElementsByTagName(“div”)*i+.style.backgroundColor = “#fff”;
    document.getElementsByTagName(“div”)*i+….
    document.getElementsByTagName(“div”)*i+.style.border = “1px solid #e00”;
    }
}

function domAM_new(){
   var divs = document. getElementsByTagName(“div”);
   for(var i = 0, l = divs.length; i < l; i++){
    document.body.appendChild(document.createElement(‘div’));
    var d = divs[i];
    d.style.backgroundColor = “#fff”;
    d….
    d.style.border = “1px solid #e00”;
    }
 }
DOM Scripting

Ajax

UI Thread

JS Loader
Xmlhttprequest

            • 只是获取数据的请求

   GET      • 数据会被缓存起来,提升性能
            • 只发送一个数据包



            • URL加上参数的长度接近或超过2048个字符
  POST      • 发送两个数据包(头信息、post正文)
Dynamic script tag insertion

跨域请求数据

function sendDynamicJS(){
    var scriptElement = document.createElement('script');
    scriptElement.src = 'json.js';
   document.getElementsByTagName('head')[0].appendChild(scriptElement);
}
Ajax
2
                        如果没有检索到,则发送Ajax请求
                          (URL : A.php?user=test3)




      1
          在缓存表中检索
                                                   3
                                                       将URL和返回的内容存入缓存表
Ajax客户端缓存表 - ajaxCacheHash

 Request URL            Response Content
 A.php?user=test1       this is test1’s introduction
 A.php?user=test2       this is test2’s introduction
 A.php?user=test3 this is test3’s introduction
Ajax More

数据格式(JSON/JSON-P/Custom Format)



服务器端缓存机制



……………………
DOM Scripting

Ajax

UI Thread

JS Loader
var button = document.getElementById(“my-button”);
button.onclick = function(){
   firstMethod();                        Time code


    setTimeout(function(){
      document.getElementById(“msg”).style.color=“red”;
    }, 25);
}
UI Thread
UI Thread

                                                                                                Javascript
                        UI Update - Button        JavaScript - onclick()
                                                                                               Timer code




UI Queue

       UI Update            JavaScript                                            Javascript
        Button                onclick                                            Timer code


       JavaScript
         onclick




                    0                        50            100             350
                                                        setTimeout()       Timer code
                                                        called             queued
Time
Splitting up Tasks
Web Workers

             Web Workers



    javascript               UI
      code                 update
>>worker.html
var worker = new Worker('my_task.js');
worker.onmessage = function(event){
    var realJson = event.data;
                                       传递大量数据
}
worker.postMessage(data);

>>my_task.js                                1.   处理大量数据
self.onmessage = function(event) {          2.   返回处理结果
     var jsonText = event.data;
     var jsonData = JSON.parse(jsonText);
     self.postMessage(jsonData);
};
DOM Scripting

Ajax

UI Thread

JS Loader
Script with engine
Script Position


                             图片资源被阻塞




                  图片资源并行加载
JS Loader



      Script
    Download     Script
               Execution
Script Download

if(isIEorOpera()){
   preObject = new Image();
}else{
   preObject = document.createElement(“object”);
}
Script Execution


var nScript = document.createElement(“script”);
nScript.type = “text/javascript”;
nScript.src = url;
document.getElementsByTagName(“head”)*0+.appendChild(nScript);
JS Loader


             图片资源被阻塞




            并行加载,不会阻塞
DOM Scripting     Ajax




 UI Thread      JS Loader
页面需要精美
功能需要完善
交互需要体贴



在任何时刻都不要让用户等太久
让他们感觉浏览你的网站是行云流水般的享受
feifeipan59@gmail.com


    @最爱牛腩的小牛-斐斐


        http://ued.ctrip.com/
附录1
• 浏览器中的DOM
     各浏览器情况


Browser       Javascript engine       DOM
IE            Jscript( jscript.dll)   Trident(mshtml.dll)
Firefox       JagerMonkey             Gecko
Chrome        V8                      WebCore
Safari        SquirrelFish            WebCore

More Related Content

What's hot (18)

PPT
Mongo db技术分享
晓锋 陈
 
PPT
JS2
Jiang Wu
 
ODP
JavaScript Advanced Skill
firestoke
 
PPTX
jQuery 選取器解析
Kingsley Zheng
 
PDF
面向开发的前端性能优化
li qiang
 
PPTX
iOS程序设计-数据持久化
qiyutan
 
PDF
07 View Controllers
Tom Fan
 
PDF
02 Objective-C
Tom Fan
 
DOC
用Jquery实现拖拽层
yiditushe
 
PDF
14 Saving Loading and Application States
Tom Fan
 
PDF
旺铺前端设计和实现
hua qiu
 
PDF
MongoDB Basic
simplels
 
PDF
Backbone.js and MVW 101
Jollen Chen
 
DOC
希望科技研发部变量命名及编码规范
Hongjian Wang
 
PPTX
前端测试
frontwindysky
 
PPT
jQuery介绍@disandu.com
Think hy
 
PDF
05 MapKit and Text Input
Tom Fan
 
PDF
Ooredis
iammutex
 
Mongo db技术分享
晓锋 陈
 
JavaScript Advanced Skill
firestoke
 
jQuery 選取器解析
Kingsley Zheng
 
面向开发的前端性能优化
li qiang
 
iOS程序设计-数据持久化
qiyutan
 
07 View Controllers
Tom Fan
 
02 Objective-C
Tom Fan
 
用Jquery实现拖拽层
yiditushe
 
14 Saving Loading and Application States
Tom Fan
 
旺铺前端设计和实现
hua qiu
 
MongoDB Basic
simplels
 
Backbone.js and MVW 101
Jollen Chen
 
希望科技研发部变量命名及编码规范
Hongjian Wang
 
前端测试
frontwindysky
 
jQuery介绍@disandu.com
Think hy
 
05 MapKit and Text Input
Tom Fan
 
Ooredis
iammutex
 

Similar to Script with engine (20)

PPTX
浅析浏览器解析和渲染
Ailsa126
 
PPTX
JavaScript 80+ Programming and Optimization Skills
Ho Kim
 
PPT
前端开发之Js
fangdeng
 
PPT
Html5和css3入门
Xiujun Ma
 
PPT
让我们的页面跑得更快
li qiang
 
PPTX
Html5培训内容
Jun Yu
 
PPTX
HTML5 介绍
S S
 
PPTX
reflow & repaint
Randy Jin
 
PDF
运维系统开发与Rails 3页面开发实践
Li JianYe
 
PDF
JavaScript Engine
jay li
 
PDF
Ajax新手快车道
yiditushe
 
PDF
Browser Object Model
jay li
 
PPT
javascript的分层概念 --- 阿当
裕波 周
 
PPTX
第三方内容开发最佳实践
taobao.com
 
PDF
淘宝前端技术巡礼
jay li
 
PDF
更好的文件组织
Kejun Zhang
 
PPTX
赶集团购开发总结4
yangdj
 
PPT
Ajax Lucence
Roger Xia
 
DOC
淘宝网前端开发面试题
Lumend
 
PPT
Html5
cazhfe
 
浅析浏览器解析和渲染
Ailsa126
 
JavaScript 80+ Programming and Optimization Skills
Ho Kim
 
前端开发之Js
fangdeng
 
Html5和css3入门
Xiujun Ma
 
让我们的页面跑得更快
li qiang
 
Html5培训内容
Jun Yu
 
HTML5 介绍
S S
 
reflow & repaint
Randy Jin
 
运维系统开发与Rails 3页面开发实践
Li JianYe
 
JavaScript Engine
jay li
 
Ajax新手快车道
yiditushe
 
Browser Object Model
jay li
 
javascript的分层概念 --- 阿当
裕波 周
 
第三方内容开发最佳实践
taobao.com
 
淘宝前端技术巡礼
jay li
 
更好的文件组织
Kejun Zhang
 
赶集团购开发总结4
yangdj
 
Ajax Lucence
Roger Xia
 
淘宝网前端开发面试题
Lumend
 
Html5
cazhfe
 
Ad

More from Webrebuild (20)

PPT
重构 这一路走来
Webrebuild
 
PPTX
构建可扩展的静态资源管理系统
Webrebuild
 
PPT
Css3之颜色与半透明
Webrebuild
 
PPTX
移动网站的兼容性探索
Webrebuild
 
PPTX
孙极-Hello, JSS! - 一种新样式语言的诞生
Webrebuild
 
PPT
陈子舜-Html5 based web app
Webrebuild
 
PPTX
谭正谊-QQ邮箱HTML5移动应用
Webrebuild
 
PPTX
唐俊开-Html5 mobile web app浅谈
Webrebuild
 
PPTX
微观重构 黄婉芳
Webrebuild
 
PDF
年会主持 By pufen
Webrebuild
 
PPT
年会主持 By pufen
Webrebuild
 
PDF
Css schema by_sofish
Webrebuild
 
PPT
重构的价值转化 By impact
Webrebuild
 
PPT
七年之痒Webrebuild by emu
Webrebuild
 
PDF
Qmail rebuild_by_nico
Webrebuild
 
PPTX
潘杰茂_网络图像优化
Webrebuild
 
PPTX
张思坚 浏览器兼容性
Webrebuild
 
PPT
飘飘 年会主持
Webrebuild
 
PDF
石玉磊 Web rebuild
Webrebuild
 
PDF
彪叔 [2010]webrebuild
Webrebuild
 
重构 这一路走来
Webrebuild
 
构建可扩展的静态资源管理系统
Webrebuild
 
Css3之颜色与半透明
Webrebuild
 
移动网站的兼容性探索
Webrebuild
 
孙极-Hello, JSS! - 一种新样式语言的诞生
Webrebuild
 
陈子舜-Html5 based web app
Webrebuild
 
谭正谊-QQ邮箱HTML5移动应用
Webrebuild
 
唐俊开-Html5 mobile web app浅谈
Webrebuild
 
微观重构 黄婉芳
Webrebuild
 
年会主持 By pufen
Webrebuild
 
年会主持 By pufen
Webrebuild
 
Css schema by_sofish
Webrebuild
 
重构的价值转化 By impact
Webrebuild
 
七年之痒Webrebuild by emu
Webrebuild
 
Qmail rebuild_by_nico
Webrebuild
 
潘杰茂_网络图像优化
Webrebuild
 
张思坚 浏览器兼容性
Webrebuild
 
飘飘 年会主持
Webrebuild
 
石玉磊 Web rebuild
Webrebuild
 
彪叔 [2010]webrebuild
Webrebuild
 
Ad

Recently uploaded (20)

PPTX
美国毕业证(AAU毕业证书)旧金山艺术大学毕业证假学位证
mbcom2
 
PPTX
新西兰毕业证(AIS毕业证书)奥克兰商学院毕业证学历学位认证
qwukyud
 
PPTX
澳洲毕业证(Flinders毕业证书)弗林德斯大学毕业证成绩单图片
apuoho
 
PPTX
加拿大毕业证(McGill毕业证书)麦吉尔大学毕业证学历文凭入职
tsaqdu
 
PDF
互兆通过零日漏洞入侵美国Top 50大学教务系统,采用SQL注入直接修改GPA记录,同步清理MySQL日志,伪造访问时间戳。全程TOR网络跳转,客户数据7...
【微信:VIPhuzhao】揭秘黑客如何利用漏洞篡改成绩数据黑客助力修改雅思考试成绩,快速提升你的语言能力 . 黑客助力帮你改考试成绩数据,黑客接单改分数,黑客改数据库成绩
 
PPTX
加拿大毕业证(YU毕业证书)约克大学毕业证成绩单、
xyqutdu
 
PPTX
英国毕业证(IC毕业证书)帝国理工大学毕业证成绩单ps
omuhk
 
PPTX
澳洲学位证书,南澳大学毕业证学历认证UniSA毕业证办理
utdzoo
 
PDF
【黑客入侵美国加州大学改GPA成绩测试!】伪造CFA Institute的数字签名证书【LSAT法学院考试改分:Kryterion监考系统绕过
【微信:VIPhuzhao】揭秘黑客如何利用漏洞篡改成绩数据黑客助力修改雅思考试成绩,快速提升你的语言能力 . 黑客助力帮你改考试成绩数据,黑客接单改分数,黑客改数据库成绩
 
PPTX
澳洲毕业证(UOW毕业证书)伍伦贡大学毕业证毕业证书改图
unftagx
 
PPTX
澳洲毕业证(UC毕业证书)堪培拉大学毕业证电子版定制
tukxaby
 
PPTX
澳洲学位证书,堪培拉大学毕业证学历认证UC毕业证哪里买
okfox
 
PPTX
澳洲毕业证(SUT毕业证书)斯威本科技大学毕业证国外大学文凭制作
tukxaby
 
PPTX
澳洲学位证书,莫纳什大学毕业证学历认证Monash毕业证加急购买
nxebwu
 
PPTX
澳洲毕业证(UWA毕业证书)西澳大学毕业证文凭购买:学历证书
zohyq
 
PPTX
澳洲毕业证(USQ毕业证书)南昆士兰大学毕业证国外大学文凭制作
batne
 
PPTX
加拿大学位证书,圭尔夫大学毕业证学历认证UofG毕业证加急办理
mbyoba
 
PPTX
英国毕业证(Coventry毕业证书)考文垂大学毕业证学位证书学历证书
uobumab
 
PPTX
新西兰毕业证(AUT毕业证书)奥克兰理工大学毕业证不能毕业如何获得
oteudep
 
PPTX
英国学位证书,诺丁汉大学毕业证学历认证UoN毕业证加急办理
obkuqa
 
美国毕业证(AAU毕业证书)旧金山艺术大学毕业证假学位证
mbcom2
 
新西兰毕业证(AIS毕业证书)奥克兰商学院毕业证学历学位认证
qwukyud
 
澳洲毕业证(Flinders毕业证书)弗林德斯大学毕业证成绩单图片
apuoho
 
加拿大毕业证(McGill毕业证书)麦吉尔大学毕业证学历文凭入职
tsaqdu
 
互兆通过零日漏洞入侵美国Top 50大学教务系统,采用SQL注入直接修改GPA记录,同步清理MySQL日志,伪造访问时间戳。全程TOR网络跳转,客户数据7...
【微信:VIPhuzhao】揭秘黑客如何利用漏洞篡改成绩数据黑客助力修改雅思考试成绩,快速提升你的语言能力 . 黑客助力帮你改考试成绩数据,黑客接单改分数,黑客改数据库成绩
 
加拿大毕业证(YU毕业证书)约克大学毕业证成绩单、
xyqutdu
 
英国毕业证(IC毕业证书)帝国理工大学毕业证成绩单ps
omuhk
 
澳洲学位证书,南澳大学毕业证学历认证UniSA毕业证办理
utdzoo
 
【黑客入侵美国加州大学改GPA成绩测试!】伪造CFA Institute的数字签名证书【LSAT法学院考试改分:Kryterion监考系统绕过
【微信:VIPhuzhao】揭秘黑客如何利用漏洞篡改成绩数据黑客助力修改雅思考试成绩,快速提升你的语言能力 . 黑客助力帮你改考试成绩数据,黑客接单改分数,黑客改数据库成绩
 
澳洲毕业证(UOW毕业证书)伍伦贡大学毕业证毕业证书改图
unftagx
 
澳洲毕业证(UC毕业证书)堪培拉大学毕业证电子版定制
tukxaby
 
澳洲学位证书,堪培拉大学毕业证学历认证UC毕业证哪里买
okfox
 
澳洲毕业证(SUT毕业证书)斯威本科技大学毕业证国外大学文凭制作
tukxaby
 
澳洲学位证书,莫纳什大学毕业证学历认证Monash毕业证加急购买
nxebwu
 
澳洲毕业证(UWA毕业证书)西澳大学毕业证文凭购买:学历证书
zohyq
 
澳洲毕业证(USQ毕业证书)南昆士兰大学毕业证国外大学文凭制作
batne
 
加拿大学位证书,圭尔夫大学毕业证学历认证UofG毕业证加急办理
mbyoba
 
英国毕业证(Coventry毕业证书)考文垂大学毕业证学位证书学历证书
uobumab
 
新西兰毕业证(AUT毕业证书)奥克兰理工大学毕业证不能毕业如何获得
oteudep
 
英国学位证书,诺丁汉大学毕业证学历认证UoN毕业证加急办理
obkuqa
 

Script with engine

  • 2. 2006 左侧的促销信息 滚动一下 右边的广告要 飘来飘去~
  • 3. 2008 让用户输入城市 简拼就能够匹配 能提示用户入住 日期输入正确性
  • 5. 角色演变 性能 100 ms 功能 美化
  • 7. DOM in the Browser World JS Engine Dom API Document Bridge (cost) HTML Javascript DOM XML 各浏览器引擎对比
  • 8. DOM Access and Modification
  • 9. DOM Access and Modification 4500 4000 3500 3000 运行时间(ms) 2500 createElement 2000 innerHTML 1500 1000 500 0
  • 10. Repaints and Reflow Reflow • 浏览器使渲染树中受到影响的部分失效 • 重新构造渲染树 Repaints • 浏览器重新绘制受影响的部分到屏幕中
  • 12. Repaints and Reflow document 1 使元素脱离文档流 div div div div div div 2 3 对其运用多重改变 把元素带回文档中 div div div div
  • 13. • function hideElement(){ 隐藏元素 var ul = document.getElementById('mylist'); ul.style.display = "none"; ……doSomethingTo_UL(); {display:none} ul.style.display = "block"; } • function useFragment(){ 文档片段 var fragment = document.createDocumentFragment(); ……doSomethingTo_fragment (); {document fragment} } document.getElementById('mylist').appendChild(fragment); • function useCopy(){ var old = document.getElementById('mylist'); 创建备份 var clone = old.cloneNode(true); {element.cloneNode} ……doSomethingTo_clone (); old.parentNode.replaceChild(clone, old); }
  • 14. Event Delegation window 5 冒泡 document 4 html 3 到达目标 body 2 捕获(非IE) div 1
  • 15. DOM Scripting function domAM(){ var newD = document.createElement(“div”); var newDChildren = newD.childNodes; var newDSomeChildren = newD.getElementById(“menu”).getElementsByTagName(“a”); } function domAM_new(){ var newD = existD.cloneNode(true); var newDChild = newD.children; var newDSomChildren = newD.querySelectorAll(“#menu a”); }
  • 16. DOM Scripting function domAM(){ var divs = document. getElementsByTagName(“div”); for(var i = 0; i < divs.length; i++){ document.body.appendChild(document.createElement(‘div’)); document.getElementsByTagName(“div”)*i+.style.backgroundColor = “#fff”; document.getElementsByTagName(“div”)*i+…. document.getElementsByTagName(“div”)*i+.style.border = “1px solid #e00”; } } function domAM_new(){ var divs = document. getElementsByTagName(“div”); for(var i = 0, l = divs.length; i < l; i++){ document.body.appendChild(document.createElement(‘div’)); var d = divs[i]; d.style.backgroundColor = “#fff”; d…. d.style.border = “1px solid #e00”; } }
  • 18. Xmlhttprequest • 只是获取数据的请求 GET • 数据会被缓存起来,提升性能 • 只发送一个数据包 • URL加上参数的长度接近或超过2048个字符 POST • 发送两个数据包(头信息、post正文)
  • 19. Dynamic script tag insertion 跨域请求数据 function sendDynamicJS(){ var scriptElement = document.createElement('script'); scriptElement.src = 'json.js'; document.getElementsByTagName('head')[0].appendChild(scriptElement); }
  • 20. Ajax
  • 21. 2 如果没有检索到,则发送Ajax请求 (URL : A.php?user=test3) 1 在缓存表中检索 3 将URL和返回的内容存入缓存表 Ajax客户端缓存表 - ajaxCacheHash Request URL Response Content A.php?user=test1 this is test1’s introduction A.php?user=test2 this is test2’s introduction A.php?user=test3 this is test3’s introduction
  • 24. var button = document.getElementById(“my-button”); button.onclick = function(){ firstMethod(); Time code setTimeout(function(){ document.getElementById(“msg”).style.color=“red”; }, 25); }
  • 25. UI Thread UI Thread Javascript UI Update - Button JavaScript - onclick() Timer code UI Queue UI Update JavaScript Javascript Button onclick Timer code JavaScript onclick 0 50 100 350 setTimeout() Timer code called queued Time
  • 27. Web Workers Web Workers javascript UI code update
  • 28. >>worker.html var worker = new Worker('my_task.js'); worker.onmessage = function(event){ var realJson = event.data; 传递大量数据 } worker.postMessage(data); >>my_task.js 1. 处理大量数据 self.onmessage = function(event) { 2. 返回处理结果 var jsonText = event.data; var jsonData = JSON.parse(jsonText); self.postMessage(jsonData); };
  • 31. Script Position 图片资源被阻塞 图片资源并行加载
  • 32. JS Loader Script Download Script Execution
  • 33. Script Download if(isIEorOpera()){ preObject = new Image(); }else{ preObject = document.createElement(“object”); }
  • 34. Script Execution var nScript = document.createElement(“script”); nScript.type = “text/javascript”; nScript.src = url; document.getElementsByTagName(“head”)*0+.appendChild(nScript);
  • 35. JS Loader 图片资源被阻塞 并行加载,不会阻塞
  • 36. DOM Scripting Ajax UI Thread JS Loader
  • 38. [email protected] @最爱牛腩的小牛-斐斐 http://ued.ctrip.com/
  • 39. 附录1 • 浏览器中的DOM 各浏览器情况 Browser Javascript engine DOM IE Jscript( jscript.dll) Trident(mshtml.dll) Firefox JagerMonkey Gecko Chrome V8 WebCore Safari SquirrelFish WebCore