Changeset 246094 in webkit
- Timestamp:
- Jun 4, 2019 7:21:26 PM (5 years ago)
- Location:
- trunk/Websites/webkit.org
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Websites/webkit.org/ChangeLog
r244992 r246094 1 2019-06-04 Jon Davis <jond@apple.com> 2 3 Improve performance of the lazy image loader 4 https://bugs.webkit.org/show_bug.cgi?id=198530 5 6 Reviewed by Devin Rousso. 7 8 * wp-content/themes/webkit/scripts/global.js: 9 (enableScrollableTables): 10 (lazyLoadImages): 11 (findParentMenu): Deleted. 12 (i.m.menus.m.targetMenu.targetMenuClass.indexOf): Deleted. 13 (inView): Deleted. 14 (): Deleted. 15 (loadImage.else.img.onload): Deleted. 16 (loadImage): Deleted. 17 (onMovement): Deleted. 18 (updateImages): Deleted. 19 1 20 2019-05-06 Justin Fan <justin_fan@apple.com> 2 21 … … 99 118 100 119 Reviewed by Devin Rousso. 101 120 102 121 The short viewport breakpoint styles should apply for small width 103 windows as well, and pagination styles need to accommodate wrapped 122 windows as well, and pagination styles need to accommodate wrapped 104 123 text labels. 105 124 -
trunk/Websites/webkit.org/wp-content/themes/webkit/scripts/global.js
r238056 r246094 1 1 document.addEventListener('DOMContentLoaded', function () { 2 var openClass = ' open-menu',3 menuClass = 'menu-item-has-children',4 menus = document.querySelectorAll('#site-nav > div > .menu > .menu-item'),5 menuLinks = document.querySelectorAll('#site-nav > div > .menu > .menu-item > a'),6 menuitems = document.querySelectorAll('#site-nav .menu-item-has-children .menu-item > a');7 8 function findParentMenu (element, className) {9 while ( (element = element.parentElement) && ! element.classList.contains(className) );10 return element;11 }12 13 for (var i = 0; i < menuLinks.length; ++i) {14 menuLinks[i].addEventListener('focus', function (e) {15 var openMenus = findParentMenu(e.target, 'menu').getElementsByClassName(openClass.trim());16 for (var m = 0; m < openMenus.length; ++m) {17 openMenus[m].className = openMenus[m].className.replace(openClass, "");18 }19 });20 }21 22 for (var i = 0; i < menuitems.length; ++i) {23 menuitems[i].addEventListener('focus', function (e) {24 var targetMenu = findParentMenu(e.target, menuClass),25 targetMenuClass = null;26 27 if ( targetMenu != undefined )28 targetMenuClass = targetMenu.className;29 30 for (var m = 0; m < menus.length; ++m) {31 menus[m].className.replace(openClass, "");32 if (menus[m] == targetMenu) {33 if (targetMenuClass.indexOf(openClass) == -1) {34 targetMenu.className += openClass;35 }36 } else {37 menus[m].className = menus[m].className.replace(openClass, "");38 }39 }40 });41 }42 43 var latest = [], updating = false;44 function inView(element) {45 var box = element.getBoundingClientRect();46 return ( (box.top >= 0 && box.left >= 0 && box.top) <= (window.innerHeight || document.documentElement.clientHeight));47 }48 49 function stageImage(element, src) {50 element.style.backgroundImage = 'url(' + src + ')';51 if (!element.parentElement.classList.contains('loaded'))52 element.parentElement.classList.add('loaded');53 }54 55 function loadImage(element) {56 var src = element.getAttribute('data-url');57 58 if (sessionStorage.getItem(src)) {59 setTimeout(function () { stageImage(element, src); }, 1);60 } else {61 var img = new Image();62 img.src = src;63 img.onload = function() {64 stageImage(element,src);65 66 try {67 sessionStorage.setItem(src, true);68 } catch (error) {69 return false; // private browsing70 }71 img = undefined;72 }73 }74 75 }76 77 function onMovement() {78 if (!updating)79 requestAnimationFrame(updateImages);80 updating = true;81 }82 83 function updateImages() {84 updating = false;85 86 for (var i = 0; i < imgs.length; i++) {87 if ( inView(imgs[i]) )88 loadImage(imgs[i]);89 }90 91 }92 2 93 3 function enableScrollableTables () { 94 var tables = document.querySelectorAll('.bodycopy > table'); 95 var tableCount = tables.length; 4 let tables = document.querySelectorAll('#content .bodycopy > table'); 96 5 97 for ( var i = 0; i < tableCount; i++) {98 varscrollableDiv = document.createElement('div');99 varpaddingDiv = document.createElement('div');6 for (let table of tables) { 7 let scrollableDiv = document.createElement('div'); 8 let paddingDiv = document.createElement('div'); 100 9 101 10 scrollableDiv.classList.add('scrollable'); … … 103 12 104 13 scrollableDiv.appendChild(paddingDiv); 105 table s[i].parentNode.insertBefore(scrollableDiv, tables[i]);14 table.parentNode.insertBefore(scrollableDiv, table); 106 15 107 paddingDiv.appendChild(table s[i]);16 paddingDiv.appendChild(table); 108 17 } 109 18 } 110 19 111 var imgs = document.querySelectorAll('div[data-url]'); 112 document.addEventListener('scroll', onMovement); 113 document.addEventListener('resize', onMovement); 20 function lazyLoadImages () { 21 let backgroundImages = document.querySelectorAll('#content div[data-url]'); 22 if (backgroundImages.length == 0) 23 return; 24 let lazyloadImageObserver = new IntersectionObserver(function (changes) { 25 for (let change of changes) { 26 if (!change.isIntersecting) 27 return; 28 change.target.style.backgroundImage = 'url(' + change.target.getAttribute('data-url') + ')'; 29 change.target.parentElement.classList.add('loaded'); 30 lazyloadImageObserver.unobserve(change.target); 31 } 32 }); 33 for (let element of backgroundImages) 34 lazyloadImageObserver.observe(element); 35 } 114 36 115 updateImages(); 37 if (window.IntersectionObserver) 38 lazyLoadImages(); 116 39 enableScrollableTables(); 117 40
Note: See TracChangeset
for help on using the changeset viewer.