170 likes | 295 Views
This project outlines the development of an Ajax framework that is designed to be memory and CPU efficient compared to ExtJs, while maintaining ease of use akin to jQuery. It emphasizes extensibility and a component-oriented architecture. Key features include a class system, event management, layout system, and CSS-based behaviors like resizable and draggable components. Additionally, the framework aims to incorporate CSS3 functionalities, ensuring cross-browser compatibility and optimized performance for web applications.
E N D
Creative Javascript Mészáros Ádám Budapest.js 2010.06.17.
Overview • My project outline • Use css for behaviours • Style injection • Actions • Practical Css3
My project outline Build an Ajax framework, that: • uses less memory, and cpu than ExtJs • as easy to learn as jQuery • is extensible • is component-oriented • works well with others • optionally uses html 5 features
My project outline 2 What we need: • Ajax • A Class system • Event Manager • Layout System • Animation • Components/Widgets
Class system Influenced by: MooTools Prototype ExtJs All mechanism use prototypes to copy functionality over inheritence. Difference: Ext doesn’t override builtins to access the „extend” or „apply” methods
Event Management • Make it cross browser: • use feature detection (addeventListener/attachEven/ fallback to Netscape) or • use Netscape model (just one handler/element/event type) so we must add a registry iterator function, • and correct event object differences • Ability to control the scope
Event Management 2 • Please don’t leak the memory! • use css to add simple behaviours: • Resizable • Selectable • Draggable and Droppable • Actions
Resizable • Extjs and jQuery implements resizables width proxy elements. • It would be a little overhead if we had large numbers of resizables. • What if we use a class to find a resizable, and observe the body.onmousedown? • Draggable, droppable, selectable, collapsable can also be implemented as class dependent.
Actions • „ext action is a piece of reusable functionality that can be shared by any components” • the main goals of Action class in extjs is to share handles, ui, config on multiple components. • some overhead: action class stores all instances of components in the „items” property -> so the component architecture must care about the item additions, and removal and execution of code
Actions 2 • what if action is just a css class? • Easy to find the enclosing component or container by iterating over parent nodes in the dom. • or if it's a fixed scope function, we can add the scope for action at the initialization. • we can also easily add ui to it by css, • and we don't need to destroy action handlers when we remove a component, • but if we want to register action items, we can do that, if we register action under some scope, • we can easily enable/disable actions for whole the site and/or parts of the site by concatenating „disabled” after action class name in the document.body • css automatically updates when a .my-action-disabled .my-action class is defined.
Event Manager 3 with this technique: • we can minimize CPU usage and thus render time • a bit of javascript is needed to create this architecture
Style tag injection • class injection is faster than javascript inline style modification: • smooth resize of grid column with css: function replaceStyleTag(styleEl,content) { var tmp = document.createElement('div'); tmp.innerHTML = '<b>o</b><style type="text/css">'+content+'</style>'; styleEl.parentNode .replaceChild(tmp.removeChild(tmp.childNodes[1],styleEl)); } but we can also optimize performance by buffering grid rows when working with large data sets.
Practical CSS3 • Lots of people refuse Internet Explorer because it's slow, uncomfortable and not up-to-date with standards • It's true but lots of css3 features are available in older versions of IE >>
Gradiens .gradient { background-image: -moz-linear-gradient(top, #000444, #223355); /* FF3.6 */ background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #000444),color-stop(1, #223355)); /* Saf4+, Chrome */ filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#000444', EndColorStr='#223355'); /* IE6,IE7 */ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#000444', EndColorStr='#223355')"; /* IE8 */ }
Alpha .rgba { background-color: #B4B490; background-color: rgba(180, 180, 144, NaN); /* FF3+, Saf3+, Opera 10.10+, Chrome */ filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFB4B490',EndColorStr='#FFB4B490'); /* IE6,IE7 */ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFB4B490',EndColorStr='#FFB4B490')"; /* IE8 */ }
Rotate .rotate { -moz-transform: rotate(7.5deg); /* FF3.5+ */ -o-transform: rotate(7.5deg); /* Opera 10.5 */ -webkit-transform: rotate(7.5deg); /* Saf3.1+, Chrome */ filter: progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=0.9914448613738104, M12=-0.13052619222005157, M21=0.13052619222005157, M22=0.9914448613738104); /* IE6,IE7 */ -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto expand', M11=0.9914448613738104, M12=-0.13052619222005157, M21=0.13052619222005157, M22=0.9914448613738104)"; /* IE8 */ zoom: 1; }
Rounded corners .round-all { -moz-border-radius: 8px; /* FF1+ */ -webkit-border-radius: 8px; /* Saf3+, Chrome */ border-radius: 8px; /* Opera 10.5, IE 9 */ } In older versions of IE you can use dd_roundies.js, but it is slow and needs some modifications.