UNPKG

zzdom

Version:

A tiny javascript API that implements only the DOM functions of jquery including chaining.

382 lines (322 loc) 19.8 kB
# zzDOM **zzDOM** is a tiny javascript API that implements only the DOM functions of [Jquery](https://jquery.com/) including chaining. * A subset of methods of Jquery implemented. Only main features are supported. * Low performance penalty over using vanilla javascript: instance one or more simple javascript objects. * Easy to customize and to extend. Clear and simple code: [KISS](https://en.wikipedia.org/wiki/KISS_principle). * Supports compiling with [Google closure compiler](https://developers.google.com/closure/compiler) with **ADVANCED_OPTIMIZATIONS** without using an externs file. * Divided into modules, a core and some optional plugins: * core. Includes the main components of **zzDOM** and the DOM functions. * visible. A plugin that includes methods related to visibility of elements. * events. Attach and remove event listeners. It can also trigger events. * forms. Basic managing of form elements. * center. Makes it easy to center elements in page. * utils. Includes some utility methods. * Small size: * core: 12.2KB minified, 3.5KB gzipped. * full (includes all the plugins): 17.6KB minified, 4.7KB gzipped. ## Browser Support No support for old browsers. No polyfills. **zzDOM** should work with any browser that supports **document.querySelectorAll()**. ## Using zzDOM Let's import **zzDOM** and define the **zz** function. You can use the name you prefer instead of **zz**: Using CommonJS: ```javascript var zzDOM = require( 'zzdom' ); var zz = zzDOM.zz; ``` Using ES modules: ```javascript import { zzDOM } from 'zzDOM-full-esm.js'; var zz = zzDOM.zz; ``` Some of them are equivalent to jquery's, but other are valid only in **zzDOM**. Using standard CSS selectors (it calls to **document.querySelectorAll**): ```javascript zz( '#myId' ).text( 'Hello world!' ); zz( '.myClass .myClass2' ).text( 'Hello world!' ); zz( 'div:nth-child(even)' ).text( 'Hello world!' ); ``` Chaining methods: ```javascript zz( '#myId' ) .text( 'Hello world!' ) .addClass( 'myClass' ) .attr( 'name', 'myName'); ``` Appending html code: ```javascript zz( '<div id="myId">New div</div>' ).appendTo( '#anotherId' ); ``` Using array syntax to access an Element: ```javascript zz( '#myId' )[0].textContent( 'Hello world!' ); // Set text of element to Hello world! zz( '.myClass' )[3].textContent( 'Hello world!' ); // Set text of fourth element to Hello world! var $divs = zz( '.myClass' ); for ( var c = 0; c < $divs.length; ++c ){ // Iterate through elements in zz( '.myClass' ) var element = $divs[ c ]; // Do something with element ... } ``` Using **each** to iterate: ```javascript var ids = []; zz( '.myClass' ).each( function( index, $this ){ ids.push( $this.attr( 'id' ) // Also works this.getAttribute( 'id' ) ); } ); ``` Using **el** to access an Element (only works when there is only 1 element, valid only in **zzDOM**): ```javascript zz( '#myId' ).el.textContent( 'Hello world!' ); // Set text of element to Hello world! ``` Using an Element: ```javascript zz( document.getElementById( 'myId' ) ).text( 'Hello world!' ); ``` Using a HTMLCollection: ```javascript zz( document.getElementsByClassName( 'myClass' ) ).text( 'Hello world!' ); ``` Using a NodeList: ```javascript zz( document.getElementsByTagName( 'div' ) ).text( 'Hello world!' ); ``` Using an id (it calls to **document.getElementById**, valid only in **zzDOM**): ```javascript zz( '#', 'myId' ).text( 'Hello world!' ); ``` Using a class (it calls to **document.getElementsByClassName**, valid only in **zzDOM**): ```javascript zz( '.', 'myClass' ).text( 'Hello world!' ); ``` Using a tag name (it calls to **document.getElementsByTagName**, valid only in **zzDOM**): ```javascript zz( 't', 'div' ).text( 'Hello world!' ); ``` Using a name (it calls to **document.getElementsByName**, valid only in **zzDOM**): ```javascript zz( 'n', 'myName' ).text( 'Hello world!' ); ``` Using a query selector (it calls to **document.querySelector**, valid only in **zzDOM**): ```javascript zz( 's', '#myId span' ).text( 'Hello world!' ); ``` ## Methods Available methods are divided into the core and some plugins: ### Core * addClass: Adds the specified class(es) to each element in the set of matched elements. * .addClass( className ): One class to be added to the class attribute of each matched element. * .addClass( classNames ): An array of classes to be added to the class attribute of each matched element. * after: Insert content, specified by the parameter, after each element in the set of matched elements. * .after( content ): Where content is a HTML string, DOM element or zzDOM object to insert after each element in the set of matched elements. * append: Insert content, specified by the parameter, to the end of each element in the set of matched elements. * .append( content ): Where content is a HTML string, DOM element or zzDOM object to insert at the end of each element in the set of matched elements. * appendTo: Insert every element in the set of matched elements to the end of the target. * .appendTo( target ): Where target is a selector, DOM element, HTML string or zzDOM object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter. * attr: Get the value of an attribute for the first element in the set of matched elements or set one or more attributes for every matched element. * .attr( attributeName ): Get the value of an attribute for the first element in the set of matched elements. * .attr( attributeName, value ): Set one attribute for the set of matched elements. If value is null, the specified attribute will be removed. * .attr( attributesObject ): Set some attributes using the specified attribute-value pairs. * before: Insert content, specified by the parameter, before each element in the set of matched elements. * .before( content ): Where content is a HTML string, DOM element or zzDOM object to insert before each element in the set of matched elements. * children: Get the children of each element in the set of matched elements, optionally filtered by a selector. * .children( [selector] ) * clone: Create a deep copy of the set of matched elements. * .clone() * closest: Traverses the element and its parents (heading toward the document root) until it finds a node that matches the specified CSS selector. * .closest( [selector ] ) * css: Get or set CSS properties. * .css( propertyName ): Get the computed style property for the first element in the set of matched elements. * .css( propertyName, value ): Set one CSS property for the set of matched elements. * .css( propertiesObject ): Set some CSS properties using the specified property-value pairs. * each: Iterate over a zzDOM object, executing a function for each matched element. * .each( function ): Function accepts an index and a zzDOM object as parameters. * empty: Remove all child nodes of the set of matched elements from the DOM. * .empty() * filter: Reduce the set of matched elements. * .filter( selector ): Reduce the set of matched elements to those that match the selector. * .filter( function ): Reduce the set of matched elements to those that pass the function's test. * find: Get the descendants of each element in the current set of matched elements, filtered by a selector. * .find( selector ) * first: Reduce the set of matched elements to the first in the set. * .first() * get: Retrieve DOM elements matched by the zzDOM object. * .get(): Retrieve all the elements matched by the zzDOM object. * .get( index ): Retrieve one of the elements matched by the zzDOM object. * hasClass: Determine whether any of the matched elements are assigned the given class. * .hasClass( className ) * height: Get the current computed height for the first element in the set of matched elements or set the height of every matched element. * .height(): Get the current computed height for the first element in the set of matched elements. * .height( value ): Set the CSS height of every matched element. * html: Get the HTML contents of the first element in the set of matched elements or set the HTML contents of every matched element. * .html(): Get the HTML contents of the first element in the set of matched elements. * .html( value ): Set the HTML contents of each element in the set of matched elements. * index: Returns an integer indicating the position of the first element within the zzDOM object relative to its sibling elements. * index() * is: Check the current matched set of elements against a selector, element, or zzDOM object and return true if at least one of these elements matches the given arguments. * .is( content ): Where content is a HTML string, DOM element or zzDOM object to check. * map: Pass each element in the current matched set through a function, producing a new zzDOM object containing the return values. * map( callback ) * next: Get the immediately following sibling of each element in the set of matched elements. * .next() * offset: Get the current coordinates of the first element, or set the coordinates of every element, in the set of matched elements, relative to the document. * .offset(): Get the current coordinates of the first element in the set of matched elements, relative to the document. * .offset( coordinates ): Set the current coordinates of every element in the set of matched elements, relative to the document. * offsetParent: Get the closest ancestor element that is positioned. * .offsetParent() * outerHeight: Get the current computed outer height (including padding, border, and optionally margin) for the first element in the set of matched elements. * .outerHeight ( [withMargin] ) * outerWidth: Get the current computed outer width (including padding, border, and optionally margin) for the first element in the set of matched elements. * .outerWidth( [withMargin] ) * parent: Get the parent of each element in the current set of matched elements. * .parent() * parents: Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector. * .parents( [selector ] ) * position: Get the current coordinates of the first element in the set of matched elements, optionally relative to the offset parent. * .position ( [relativeToViewport] ) * prepend: Insert content, specified by the parameter, to the beginning of each element in the set of matched elements. * .prepend( content ): Where content is a HTML string, DOM element or zzDOM object to insert at the beginning of each element in the set of matched elements. * prev: Get the immediately preceding sibling of each element in the set of matched elements. * .prev() * remove: Remove the set of matched elements from the DOM. * .remove() * removeAttr: Remove an attribute from each element in the set of matched elements. * .removeAttr( attributeName ) * removeClass: Remove a single class, multiple classes, or all classes from each element in the set of matched elements. * .removeClass( className ): Remove one class. * .removeClass( classNames ): Remove an array of classes. * .removeClass(): Remove all classes. * replaceWith: Replace each element in the set of matched elements with the provided new content. * .replaceWith( newContent ): * siblings: Get the siblings of each element in the set of matched elements, optionally filtered by a selector. * .siblings( [selector] ) * text: Get the text contents of the first element in the set of matched elements or set the text contents of every matched element. * .text( text ) * toggleClass: Add or remove one class from each element in the set of matched elements, depending on either the class's presence or the value of the state argument. * .toggleClass( className ): Add or remove one class from each element in the set of matched elements, depending on either the class's presence * .toggleClass( className, state ): Add or remove one class from each element in the set of matched elements, depending on the value of the state argument. * width: Get the current computed width for the first element in the set of matched elements or set the width of every matched element. * .width(): Get the current computed width for the first element in the set of matched elements. * .width( value ): Set the CSS width of every matched element. ### Center plugin * getXCenter: Returns the X coordinate centering the first element in the set of matched elements in the screen. It uses **document.documentElement.clientWidth** and **outerWidth** of the element. * .getXCenter() * getYCenter: Returns the Y coordinate centering the first element in the set of matched elements in the screen. It uses **document.documentElement.clientHeight** and **outerHeight** of the element. * .getYCenter() * getCenter: Returns a plain object with the coordinates centering the first element in the set of matched elements in the screen. * .getCenter() * center: Center the first element in the set of matched elements in the screen. * .center() * centerX: Center the X coordinate of the first element in the set of matched elements in the screen. * .centerX() * centerY: Center the Y coordinate of the first element in the set of matched elements in the screen. * .centerY() ### Events plugin * off: Remove one or more event handlers. If a listener is specified, remove only this; if an event name is specified, remove all listeners for this event; if no event name is specified remove all listeneres. * .off( [eventName], [listener], [useCapture] ) * on: Attach an event handler function for one event to the selected elements. * .on( eventName, listener, [data], [useCapture] ) * trigger: Execute all handlers and behaviors attached to the matched elements for the given event type. * .trigger( eventName, [params] ). ### Forms plugin * checked: Get or set checked status of checkbox or radio elements. A shortcut for using **prop** with the **checked** key. * checked(): Return the checked boolean of the first matching element found. * checked( checked ): Set checked status of checkbox or radio elements in the set of matched elements. * disabled: Get or set the value of the disabled HTML attribute. A shortcut for using **prop** with the **disabled** key. * disabled(): Get the value of the disabled HTML attribute. * disabled( value ): Set the value of the disabled HTML attribute. * indeterminate: Get or set the value of the indeterminate HTML attribute. A shortcut for using **prop** with the **indeterminate** key. * indeterminate(): Get the value of the indeterminate HTML attribute. * indeterminate( value ): Set the value of the indeterminate HTML attribute. * prop: Get the value of a property for the first element in the set of matched elements or set one or more properties for every matched element. Examples of properties are checked, disabled, indeterminate... * prop( propertyName ): Get the value of a property for the first element in the set of matched elements. * prop( propertyName, value ): Set one or more properties for the set of matched elements. * val: Get or set the value of matching form elements. * val(): Return the value of the first matching element found. * val( value ): Set the value of elements in the set of matched elements. ### Utils plugin * param: Create a serialized representation of a plain object, or a ZZDOM object suitable for use in a URL query string or Ajax request. * zzDOM.param() ### Visible plugin * fadeIn( {[ms] , [callback] } ): Display the matched elements by fading them to opaque. * fadeIn( {[ms] , [callback] } ): Optional parameters are ms (a number determining how long the animation will run) and callback (a function to call once the animation is complete). * fadeOut( {[ms] , [callback] } ): Hide the matched elements by fading them to transparent. * fadeOut( {[ms] , [callback] } ): Optional parameters are ms (a number determining how long the animation will run) and callback (a function to call once the animation is complete). * isVisible: Returns true if the first element in the set of matched elements is visible, or false otherwise. * isVisible() * hide: Hide the matched elements. * .hide() * show: Display the matched elements. * .show(); * toggle: Display or hide the matched elements. * .toggle(): Display or hide the matched elements, depending on either the element's current display. * .toggle( display ): Use true to show the element or false to hide it. ## Extending zzDOM Extending zzDOM is easy. Take a look to a the **Hello world!** plugin: ```javascript zzDOM.add( zzDOM.SS.prototype.hello = function(){ this.el.textContent = 'Hello, world!'; return this; } ); ``` The **isNumeric** plugin return **true** if at least one of the matching elements is a number: ```javascript zzDOM.add( zzDOM.SS.prototype.isNumeric = function(){ return ! isNaN( this.el.textContent ); }, zzDOM.MM.constructors.booleanOr ); ``` Where: * *zzDOM.SS* is an object representing a single HTML Element instance. * *zzDOM.MM* is an object representing a group of HTML Element instances. The first argument is a function that manges single HTML elements. The second argument is a function that defines the behaviour when matching elements are more than one. Available options are: * *zzDOM.MM.constructors.booleanOr*. Returns **true** if at least one of the results is **true**. Examples are **hasClass** and **is** methods. * *zzDOM.MM.constructors.callback*. Returns the same object and run the callback just once. Examples are **fadeIn** and **fadeOut** methods. * *zzDOM.MM.constructors.concat*. Concat the results of all the executions. Examples are **children** and **find** methods. * *zzDOM.MM.constructors.default*. Returns the results of the execution of the first element in the set of matched elements if its value is not an instance of **zzDOM.SS**. Otherwise returns a **zzDOM.MM** instance. Examples are **text** and **width** methods. If no second argument is set *zzDOM.MM.constructors.default* is used. A more useful example can be a plugin to use [Velocity](http://velocityjs.org/), the animation engine. A first version: ```javascript zzDOM.add( zzDOM.SS.prototype.velocity = function( options1, options2 ){ Velocity( this.el, options1, options2 ); return this; } ); ``` An improved version: ```javascript zzDOM.add( zzDOM.SS.prototype.velocity = function(){ // Build args array with this.el as first position and then the arguments of this function var args = Array.prototype.slice.call( arguments ); args.unshift( this.el ); // Call Velocity using the new array Velocity.apply( Velocity, args ); return this; } ); ``` ## Build and test To download the sources and build **zzDOM** run the next commands in your console: ```bash git clone https://github.com/davidcana/zzDOM.git cd zzDOM npm install npm run build ``` To start a web server to test **zzDOM** run: ```bash npm run start ``` Then start your favourite browser and open **http://127.0.0.1:9000/**. To run the tests open **http://127.0.0.1:9000/test/**. ## License [LGPL](http://www.gnu.org/licenses/lgpl.html)