You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

965 lines
29 KiB

4 years ago
<p align="center">
<img src="./resources/logo/logo.png" alt="Cash Logo" width="400px">
</p>
# Cash
Cash is an absurdly small jQuery alternative for modern browsers (IE11+) that provides jQuery-style syntax for manipulating the DOM. Utilizing modern browser features to minimize the codebase, developers can use the familiar chainable methods at a fraction of the file size. 100% feature parity with jQuery isn't a goal, but Cash comes helpfully close, covering most day to day use cases.
## Comparison
| Size | Cash | Zepto 1.2.0 | jQuery Slim 3.4.1 |
| ------------------ | ----------- | ----------- | ----------------- |
| Unminified | **34.9 KB** | 58.7 KB | 227 KB |
| Minified | **15.3 KB** | 26 KB | 71 KB |
| Minified & Gzipped | **5.7 KB** | 9.8 KB | 24.4 KB |
A **76.6%** gain in size reduction compared to jQuery. If you need a smaller bundle, we support [partial builds](https://github.com/fabiospampinato/cash/blob/master/docs/partial_builds.md) too.
| Features | Cash | Zepto 1.2.0 | jQuery Slim 3.4.1 |
| ------------------------ | ---------------------------------- | ------------------------------ | ------------------------------ |
| Supports Older Browsers | ❌ | ️❌ | ✔ |
| Supports Modern Browsers | ✔ | ️✔ | ✔ |
| Actively Maintained | ✔ | ❌ | ✔ |
| Namespaced Events | ✔ | ️❌ | ✔ |
| Typed Codebase | ✔ (TypeScript) | ️❌ | ❌ |
| TypeScript Types | ✔ (generated from code) | ⚠️ (via DefinitelyTyped) | ⚠️ (via DefinitelyTyped) |
| Partial Builds | ✔ (can exclude individual methods) | ⚠️ (can exclude whole modules) | ⚠️ (can exclude whole modules) |
If you're migrating from jQuery be sure to read our [migration guide](https://github.com/fabiospampinato/cash/blob/master/docs/migration_guide.md).
## Usage
Get Cash from [CloudFlare](https://cdnjs.cloudflare.com/ajax/libs/cash/7.0.3/cash.min.js) or [jsDelivr](https://cdn.jsdelivr.net/npm/cash-dom@7.0.3/dist/cash.min.js) and use it like this:
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/cash/7.0.3/cash.min.js"></script>
<script>
$(function () {
$('html').addClass ( 'dom-loaded' );
$('<footer>Appended with Cash</footer>').appendTo ( document.body );
});
</script>
```
Cash is also available through [npm](http://npmjs.com) as the [`cash-dom`](https://www.npmjs.com/package/cash-dom) package:
```sh
npm install --save cash-dom
```
That you can then use like this:
```js
import $ from "cash-dom";
$(function () {
$('html').addClass ( 'dom-loaded' );
$('<footer>Appended with Cash</footer>').appendTo ( document.body );
});
```
## Documentation
Cash gives you a query selector, [collection methods](#collection-methods) and some [library methods](#cash-methods). If you need more details about our API just check out [jQuery's](http://api.jquery.com), while we don't implement everything that jQuery provides, everything what we do implement should be compatible with jQuery. Cash can be extended with custom methods, read how [here](https://github.com/fabiospampinato/cash/blob/master/docs/extending_cash.md).
### $()
This is the main selector method for Cash. It returns an actionable collection of nodes.
If a function is provided, the function will be run once the DOM is ready.
```js
$( selector [, element] ) // => collection, using `element` as the context
$( selector [, collection] ) // => collection, using `collection` as the context
$(node) // => collection
$(nodeList) // => collection
$(htmlString) // => collection
$(collection) // => self
$(function () {}) // => document ready callback
```
### Collection Methods
These methods from the collection prototype ([$.fn](#fn)) are available once you create a collection with `$()` and are called like so:
```js
$(element).addClass ( className ) // => collection
```
Some [extra methods](https://github.com/fabiospampinato/cash/tree/master/src/extra) are available but [disabled](https://github.com/fabiospampinato/cash/blob/master/pacco.json#L3) by default.
| Attributes | Collection | CSS | Data | Dimensions | Effects |
| ------------------------------------ | -------------------------- | -------------------- | ---------------------- | ------------------------------------ | -------------------------- |
| [fn.addClass ()](#fnaddclass-) | [fn.add ()](#fnadd-) | [fn.css ()](#fncss-) | [fn.data ()](#fndata-) | [fn.height ()](#fnheight-) | [fn.hide ()](#fnhide-) |
| [fn.attr ()](#fnattr-) | [fn.each ()](#fneach-) | | | [fn.innerHeight ()](#fninnerheight-) | [fn.show ()](#fnshow-) |
| [fn.hasClass ()](#fnhasclass-) | [fn.eq ()](#fneq-) | | | [fn.innerWidth ()](#fninnerwidth-) | [fn.toggle ()](#fntoggle-) |
| [fn.prop ()](#fnprop-) | [fn.filter ()](#fnfilter-) | | | [fn.outerHeight ()](#fnouterheight-) | |
| [fn.removeAttr ()](#fnremoveattr-) | [fn.first ()](#fnfirst-) | | | [fn.outerWidth ()](#fnouterwidth-) | |
| [fn.removeClass ()](#fnremoveclass-) | [fn.get ()](#fnget-) | | | [fn.width ()](#fnwidth-) | |
| [fn.removeProp ()](#fnremoveprop-) | [fn.index ()](#fnindex-) | | | | |
| [fn.toggleClass ()](#fntoggleclass-) | [fn.last ()](#fnlast-) | | | | |
| | [fn.map ()](#fnmap-) | | | | |
| | [fn.slice ()](#fnslice-) | | | | |
| Events | Forms | Manipulation | Offset | Traversal |
| ---------------------------- | -------------------------------- | -------------------------------------- | -------------------------------------- | -------------------------------------- |
| [fn.off ()](#fnoff-) | [fn.serialize ()](#fnserialize-) | [fn.after ()](#fnafter-) | [fn.offset ()](#fnoffset-) | [fn.children ()](#fnchildren-) |
| [fn.on ()](#fnon-) | [fn.val ()](#fnval-) | [fn.append ()](#fnappend-) | [fn.offsetParent ()](#fnoffsetparent-) | [fn.closest ()](#fnclosest-) |
| [fn.one ()](#fnone-) | | [fn.appendTo ()](#fnappendto-) | [fn.position ()](#fnposition-) | [fn.contents ()](#fncontents-) |
| [fn.ready ()](#fnready-) | | [fn.before ()](#fnbefore-) | | [fn.find ()](#fnfind-) |
| [fn.trigger ()](#fntrigger-) | | [fn.clone ()](#fnclone-) | | [fn.has ()](#fnhas-) |
| | | [fn.detach ()](#fndetach-) | | [fn.is ()](#fnis-) |
| | | [fn.empty ()](#fnempty-) | | [fn.next ()](#fnnext-) |
| | | [fn.html ()](#fnhtml-) | | [fn.nextAll ()](#fnnextall-) |
| | | [fn.insertAfter ()](#fninsertafter-) | | [fn.nextUntil ()](#fnnextuntil-) |
| | | [fn.insertBefore ()](#fninsertbefore-) | | [fn.not ()](#fnnot-) |
| | | [fn.prepend ()](#fnprepend-) | | [fn.parent ()](#fnparent-) |
| | | [fn.prependTo ()](#fnprependto-) | | [fn.parents ()](#fnparents-) |
| | | [fn.remove ()](#fnremove-) | | [fn.parentsUntil ()](#fnparentsuntil-) |
| | | [fn.replaceAll ()](#fnreplaceall-) | | [fn.prev ()](#fnprev-) |
| | | [fn.replaceWith ()](#fnreplacewith-) | | [fn.prevAll ()](#fnprevall-) |
| | | [fn.text ()](#fntext-) | | [fn.prevUntil ()](#fnprevuntil-) |
| | | [fn.unwrap ()](#fnunwrap-) | | [fn.siblings ()](#fnsiblings-) |
| | | [fn.wrap ()](#fnwrap-) | | |
| | | [fn.wrapAll ()](#fnwrapall-) | | |
| | | [fn.wrapInner ()](#fnwrapinner-) | | |
#### $.fn
The main prototype for collections, allowing you to extend Cash with plugins by adding methods to all collections.
```js
$.fn // => Cash.prototype
$.fn.myMethod = function () {}; // Custom method added to all collections
$.fn.extend ( object ); // Add multiple methods to the prototype
```
#### fn.add ()
Returns a new collection with the element(s) added to the end.
```js
$(element).add ( element ) // => collection
$(element).add ( selector ) // => collection
$(element).add ( collection ) // => collection
```
#### fn.addClass ()
Adds the `className` class to each element in the collection.
Accepts space-separated `className` for adding multiple classes.
```js
$(element).addClass ( className ) // => collection
```
#### fn.after ()
Inserts content or elements after the collection.
```js
$(element).after ( element ) // => collection
$(element).after ( htmlString ) // => collection
$(element).after ( content [, content] ) // => collection
```
#### fn.append ()
Appends content or elements to each element in the collection.
```js
$(element).append ( element ) // => collection
$(element).append ( htmlString ) // => collection
$(element).append ( content [, content] ) // => collection
```
#### fn.appendTo ()
Adds the elements in the collection to the target element(s).
```js
$(element).appendTo ( element ) // => collection
```
#### fn.attr ()
Without `attrValue`, returns the attribute value of the first element in the collection.
With `attrValue`, sets the attribute value of each element of the collection.
```js
$(element).attr ( attrName ) // value
$(element).attr ( attrName, attrValue ) // => collection
$(element).attr ( object ) // => collection
```
#### fn.before ()
Inserts content or elements before the collection.
```js
$(element).before ( element ) // => collection
$(element).before ( htmlString ) // => collection
$(element).before ( content [, content] ) // => collection
```
#### fn.children ()
Without a selector specified, returns a collection of child elements.
With a selector, returns child elements that match the selector.
```js
$(element).children () // => collection
$(element).children ( selector ) // => collection
```
#### fn.closest ()
Returns the closest matching selector up the DOM tree.
```js
$(element).closest ( selector ) // => collection
```
#### fn.contents ()
Get the children of each element in the set of matched elements, including text and comment nodes.
Useful for selecting elements in friendly iframes.
```js
$('iframe').contents ().find ( '*' ) // => collection
```
#### fn.clone ()
Returns a collection with cloned elements.
```js
$(element).clone () // => collection
```
#### fn.detach ()
Removes collection elements, optionally that match the selector, from the DOM.
```js
$(element).detach () // => collection
$(element).detach ( selector ) // => collection
```
#### fn.css ()
Returns a CSS property value when just property is supplied.
Sets a CSS property when property and value are supplied.
Sets multiple properties when an object is supplied.
Properties will be autoprefixed if needed for the user's browser.
```js
$(element).css ( property ) // => value
$(element).css ( property, value ) // => collection
$(element).css ( object ) // => collection
```
#### fn.data ()
Without arguments, returns an object mapping all the `data-*` attributes to their values.
With a `key`, return the value of the corresponding `data-*` attribute.
With both a `key` and `value`, sets the value of the corresponding `data-*` attribute to `value`.
Multiple data can be set when an object is supplied.
```js
$(element).data () // => object
$(element).data ( key ) // => value
$(element).data ( key, value ) // => collection
$(element).data ( object ) // => collection
```
#### fn.each ()
Iterates over a collection with `callback ( index, element )`. The callback function may exit iteration early by returning `false`.
```js
$(element).each ( callback ) // => collection
```
#### fn.empty ()
Empties the elements interior markup.
```js
$(element).empty () // => collection
```
#### fn.eq ()
Returns a collection with the element at index.
```js
$(element).eq ( index ) // => collection
```
#### fn.extend ()
Adds properties to the Cash collection prototype.
```js
$.fn.extend ( object ) // => object
```
#### fn.filter ()
Returns the collection that results from applying the filter selector/method.
```js
$(element).filter ( selector ) // => collection
$(element).filter ( function ( index, element ) {} ) // => collection
```
#### fn.find ()
Returns selector match descendants from the first element in the collection.
```js
$(element).find ( selector ) // => collection
```
#### fn.first ()
Returns a collection containing only the first element.
```js
$(element).first () // => collection
```
#### fn.get ()
Returns the element at the index, or returns all elements.
```js
$(element).get ( index ) // => domNode
$(element).get () // => domNode[]
```
#### fn.has ()
Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.
```js
$(element).has ( selector ) // => collection
$(element).has ( element ) // => collection
```
#### fn.hasClass ()
Returns the boolean result of checking if any element in the collection has the `className` attribute.
```js
$(element).hasClass ( className ) // => boolean
```
#### fn.height ()
Returns or sets the height of the element.
```js
$(element).height () // => Integer
$(element).height ( number ) // => collection
```
#### fn.hide ()
Hide the elements.
```js
$(element).hide () // => collection
```
#### fn.html ()
Returns the HTML text of the first element in the collection, sets the HTML if provided.
```js
$(element).html () // => HTML Text
$(element).html ( htmlString ) // => HTML Text
```
#### fn.index ()
Returns the index of the element in its parent if an element or selector isn't provided. Returns index within element or selector if it is.
```js
$(element).index () // => Integer
$(element).index ( element ) // => Integer
```
#### fn.innerHeight ()
Returns the height of the element + padding.
```js
$(element).innerHeight () // => Integer
```
#### fn.innerWidth ()
Returns the width of the element + padding.
```js
$(element).innerWidth () // => Integer
```
#### fn.insertAfter ()
Inserts collection after specified element.
```js
$(element).insertAfter ( element ) // => collection
```
#### fn.insertBefore ()
Inserts collection before specified element.
```js
$(element).insertBefore ( element ) // => collection
```
#### fn.is ()
Returns whether the provided selector, element or collection matches any element in the collection.
```js
$(element).is ( selector ) // => boolean
```
#### fn.last ()
Returns a collection containing only the last element.
```js
$(element).last () // => collection
```
#### fn.map ()
Returns a new collection, mapping each element with `callback ( index, element )`.
```js
$(selector).map ( callback ) // => collection
```
#### fn.next ()
Returns the next adjacent elements.
```js
$(element).next () // => collection
$(element).next ( selector ) // => collection
```
#### fn.nextAll ()
Returns all the next elements.
```js
$(element).nextAll () // => collection
$(element).nextAll ( selector ) // => collection
```
#### fn.nextUntil ()
Returns all the next elements, until the provided selector matches.
```js
$(element).nextUntil ( selector ) // => collection
$(element).nextUntil ( selector, filterSelector ) // => collection
```
#### fn.not ()
Filters collection by false match on collection/selector.
```js
$(element).not ( selector ) // => collection
$(element).not ( collection ) // => collection
```
#### fn.off ()
Removes event listener from collection elements.
Accepts space-separated `eventName` for removing multiple events listeners.
Removes all event listeners if called without arguments.
```js
$(element).off ( eventName, eventHandler ) // => collection
$(element).off ( eventName ) // => collection
$(element).off ( eventsMap ) // => collection
$(element).off () // => collection
```
#### fn.offset ()
Get the coordinates of the first element in a collection relative to the document.
```js
$(element).offset () // => Object
```
#### fn.offsetParent ()
Get the first element's ancestor that's positioned.
```js
$(element).offsetParent () // => collection
```
#### fn.on ()
Adds event listener to collection elements.
Accepts space-separated `eventName` for listening to multiple events.
Event is delegated if delegate is supplied.
```js
$(element).on ( eventsMap ) // => collection
$(element).on ( eventName, eventHandler ) // => collection
$(element).on ( eventName, delegate, eventHandler ) // => collection
```
#### fn.one ()
Adds event listener to collection elements that only triggers once for each element.
Accepts space-separated `eventName` for listening to multiple events.
Event is delegated if delegate is supplied.
```js
$(element).one ( eventName, eventHandler ) // => collection
$(element).one ( eventName, delegate, eventHandler ) // => collection
```
#### fn.outerHeight ()
Returns the outer height of the element. Includes margins if `includeMargings` is set to true.
```js
$(element).outerHeight () // => Integer
$(element).outerHeight ( includeMargins ) // => Integer
```
#### fn.outerWidth ()
Returns the outer width of the element. Includes margins if `includeMargings` is set to true.
```js
$(element).outerWidth () // => Integer
$(element).outerWidth ( includeMargins ) // => Integer
```
#### fn.parent ()
Returns collection of elements who are parent of elements.
```js
$(element).parent () // => collection
$(element).parent ( selector ) // => collection
```
#### fn.parents ()
Returns collection of elements who are parents of elements. Optionally filtering by selector.
```js
$(element).parents () // => collection
$(element).parents ( selector ) // => collection
```
#### fn.parentsUntil ()
Returns collection of elements who are parents of elements, until a provided selector matches. Optionally filtering by selector.
```js
$(element).parentsUntil ( selector ) // => collection
$(element).parentsUntil ( selector, filterSelector ) // => collection
```
#### fn.position ()
Get the coordinates of the first element in a collection relative to its `offsetParent`.
```js
$(element).position () // => object
```
#### fn.prepend ()
Prepends content or elements to the each element in collection.
```js
$(element).prepend ( element ) // => collection
$(element).prepend ( htmlString ) // => collection
$(element).prepend ( content [, content] ) // => collection
```
#### fn.prependTo ()
Prepends elements in a collection to the target element(s).
```js
$(element).prependTo ( element ) // => collection
```
#### fn.prev ()
Returns the previous adjacent elements.
```js
$(element).prev () // => collection
$(element).prev ( selector ) // => collection
```
#### fn.prevAll ()
Returns all the previous elements.
```js
$(element).prevAll () // => collection
$(element).prevAll ( selector ) // => collection
```
#### fn.prevUntil ()
Returns all the previous elements, until the provided selector matches.
```js
$(element).prevUntil ( selector ) // => collection
$(element).prevUntil ( selector, filterSelector ) // => collection
```
#### fn.prop ()
Returns a property value when just property is supplied.
Sets a property when property and value are supplied, and sets multiple properties when an object is supplied.
```js
$(element).prop ( property ) // => property value
$(element).prop ( property, value ) // => collection
$(element).prop ( object ) // => collection
```
#### fn.ready ()
Calls callback method on DOMContentLoaded.
```js
$(document).ready ( callback ) // => collection/span
```
#### fn.remove ()
Removes collection elements, optionally that match the selector, from the DOM and removes all their event listeners.
```js
$(element).remove () // => collection
$(element).remove ( selector ) // => collection
```
#### fn.replaceAll ()
This is similar to [fn.replaceWith ()](#fnreplacewith-), but with the source and target reversed.
```js
$(element).replaceAll ( content ) // => collection
```
#### fn.replaceWith ()
Replace collection elements with the provided new content.
```js
$(element).replaceWith ( content ) // => collection
```
#### fn.removeAttr ()
Removes attribute from collection elements.
Accepts space-separated attrName for removing multiple attributes.
```js
$(element).removeAttr ( attrName ) // => collection
```
#### fn.removeClass ()
Removes className from collection elements.
Accepts space-separated className for adding multiple classes.
Providing no arguments will remove all classes.
```js
$(element).removeClass () // => collection
$(element).removeClass ( className ) // => collection
```
#### fn.removeProp ()
Removes property from collection elements.
```js
$(element).removeProp ( propName ) // => collection
```
#### fn.serialize ()
When called on a form, serializes and returns form data.
```js
$(form).serialize () // => String
```
#### fn.show ()
Show the elements.
```js
$(element).show () // => collection
```
#### fn.siblings ()
Returns a collection of sibling elements.
```js
$(element).siblings () // => collection
$(element).siblings ( selector ) // => collection
```
#### fn.slice ()
Returns a new collection with elements taken from start to end.
```js
$(selector).slice ( start, end ) // => collection
```
#### fn.text ()
Returns the inner text of the first element in the collection, sets the text if textContent is provided.
```js
$(element).text () // => text
$(element).text ( textContent ) // => collection
```
#### fn.toggle ()
Hide or show the elements.
```js
$(element).toggle () // => collection
```
#### fn.toggleClass ()
Adds or removes className from collection elements based on if the element already has the class.
Accepts space-separated classNames for toggling multiple classes, and an optional `force` boolean to ensure classes are added (`true`) or removed (`false`).
```js
$(element).toggleClass ( className ) // => collection
$(element).toggleClass ( className, force ) // => collection
```
#### fn.trigger ()
Triggers supplied event on elements in collection. Data can be passed along as the second parameter.
```js
$(element).trigger ( eventName ) // => collection
$(element).trigger ( eventObj ) // => collection
$(element).trigger ( eventName, data ) // => collection
$(element).trigger ( eventObj, data ) // => collection
```
#### fn.unwrap ()
Removes the wrapper from all elements.
```js
$(element).unwrap () // => collection
```
#### fn.val ()
Returns an inputs value. If value is supplied, sets all inputs in collection's value to the value argument.
```js
$(input).val () // => value
$(input).val ( value ) // => collection
```
#### fn.width ()
Returns or sets the width of the element.
```js
$(element).width () // => number
$(element).width ( number ) // => collection
```
#### fn.wrap ()
Wraps a structure around each element.
```js
$(element).wrap ( structure ) // => collection
```
#### fn.wrapAll ()
Wraps a structure around all elements.
```js
$(element).wrapAll ( structure ) // => collection
```
#### fn.wrapInner ()
Wraps a structure around all children.
```js
$(element).wrapInner ( structure ) // => collection
```
### Cash Methods
These methods are exported from the global `$` object, and are called like so:
```js
$.isArray ( arr ) // => boolean
```
Some [extra methods](https://github.com/fabiospampinato/cash/tree/master/src/extra) are available but [disabled](https://github.com/fabiospampinato/cash/blob/master/pacco.json#L3) by default.
| Type Checking | Utilities |
| ------------------------------- | ----------------------------- |
| [$.isArray ()](#isarray-) | [$.guid](#guid) |
| [$.isFunction ()](#isfunction-) | [$.each ()](#each-) |
| [$.isNumeric ()](#isnumeric-) | [$.extend ()](#extend-) |
| [$.isWindow ()](#iswindow-) | [$.parseHTML ()](#parsehtml-) |
| | [$.unique ()](#unique-) |
#### $.guid
A unique number.
```js
$.guid++ // => number
```
#### $.each ()
Iterates through an array and calls the `callback ( index, element )` method on each element. The callback function may exit iteration early by returning `false`.
```js
$.each ( array, callback ) // => array
```
#### $.extend ()
Extends target object with properties from the source object.
```js
$.extend ( target, source ) // => object
```
#### $.isArray ()
Check if the argument is an array.
```js
$.isArray ([ 1, 2, 3 ]) // => true
```
#### $.isFunction ()
Check if the argument is a function.
```js
function fn () {};
$.isFunction ( fn ) // => true
```
#### $.isNumeric ()
Check if the argument is numeric.
```js
$.isNumeric ( 57 ) // => true
```
#### $.isWindow ()
Check if the argument is a Window object.
```js
$.isWindow ( window ) // => true
```
#### $.parseHTML ()
Returns a collection from an HTML string.
```js
$.parseHTML ( htmlString ) // => collection
```
#### $.unique ()
Returns a new array with duplicates removed.
```js
$.unique ( array ) // => array
```
## Contributing
If you found a problem, or have a feature request, please open an [issue](https://github.com/fabiospampinato/cash/issues) about it.
If you want to make a pull request you should:
1. Clone the repository: `git clone https://github.com/fabiospampinato/cash.git`.
2. Enter the cloned repository: `cd cash`
3. Install the dependencies: `npm install`.
4. Automatically recompile Cash whenever a change is made: `npm run dev`.
5. Automatically rerun the tests whenever a change is made: `npm run test:watch`.
6. Remember to update the readme, if necessary.
## Thanks
- **[@kenwheeler](https://github.com/kenwheeler), [@shshaw](https://github.com/shshaw), [@jamiebuilds](https://github.com/jamiebuilds), [@simeydotme](https://github.com/simeydotme)** and all the contributors who helped making Cash.
- **[@hisk](https://github.com/hisk)** - The "design focused engineer" behind our awesome logo.
- **[Sauce Labs](https://saucelabs.com)** - The cross-browser testing platform we use for testing our builds in all the supported environments.
## License
MIT © Fabio Spampinato