@ambers/domite v0.9.0
Lite mite wrapping basic DOM for Amber Smalltalk
Lite mite wrapping basic DOM for Amber Smalltalk.
It uses a selection of raw DOM API to perform tasks;
it does not use any cross-browser library.
To work on IE8 (or other non-compliant browser),
include amber-compat-es5 and also shim event API
(https://github.com/jonathantneal/EventListener looks good).
Getting Started
- Install Amber (Instructions)
- Do
amber init npm install @ambers/domite --savegrunt devel- Start server with
amber serveand go tohttp://localhost:4000/
This makes modules from domite namespace loadable.
To do so in the Helios IDE change the imports: section of your packages which use Domite to
imports: {'domite/DOMite'}.
Or you may add it to the testing.js / devel.js files.
The former is preferred because of an easier deployment process.
API (class doc of class Domite)
I am (hopefully thin) wrapper around the notion of "cursor in a page". I represent a DOM node and a point where to insert new content into it.
So I play both the role of a container that inserts as well as the role of an element being inserted.
I inherit from ProtoStream.
Creation API:
Domite newcreates an insertion point at the bottom of<body>.Domite newStreamis unique way to create pieces of content. It creates an instance "floating in thin air" (wrapper around DOM DocumentFragment) that can be filled with any contents and then inserted in a page.Domite fromElement: aDomElementwraps an element and set the cursor to its end.Domite newElement: 'div'creates new<div />element (and returns it wrapped as a Domite).
CSS selector API:
Domite at: aSelectorwraps an element found bydocument.querySelector(aSelector).aDomite at: aSelectorwraps an element found byelement.querySelector(aSelector).Domite allAt: aSelectorreturn collection of wrapped results ofdocument.querySelectorAll(aSelector).aDomite allAt: aSelectorreturn collection of wrapped results ofelement.querySelectorAll(aSelector).
Manipulation API:
aDomite << objinserts obj at the insertion point.aDomite resetContentsdeletes contents of the wrapped element.aDomite cutUpTo: anotherDomiteremoves contents between the two cursors (or up to the end of the receiver) and returns it collected in a wrapped DocumentFragment (IOW, you cananotherPlace << theResultto move the contents in the specified range).aDomite attrAt: aStringreturns attribute of the wrapped element or nil.aDomite attrAt: aString put: anotherStringsets an attribute of the wrapped element.aDomite propAt: aStringreturns JS property of the wrapped element or nil.aDomite propAt: aString put: anObjectsets JS property of the wrapped element.
Cursor moving API:
Take this sample HTML, where [n] are just markers, not real content:
<body>
<h1>header</h1>
[4]<p>[2]Hello[1]world[3]</p>[5]
<small>footer</small>
</body>If d is a Domite representing [1], then:
d setToStartwould movedto be at[2],d setToEndwould movedto be at[3],d setToBeforewould movedto be at[4], andd setToAfterwould movedto be at[5].
It is not presumed one would use setToXxx
to actually move around in a single instance.
It is envisioned this API will be used mostly
in combination with copy, like
afterMe := self copy setToAfter.
Event API:
aDomite on: aString bind: [ :ev | ... ]binds a block to process an event.aDomite off: aString unbind: aBlockunbinds the block from processing an event.aDomite fire: aString [detail: anObject]triggers a CustomEvent with specified type and, optionally, a detail object.aDomite fireEvent: anEventtriggers existing DOM Event object!
Contributing
To bring project alive (for example after git clone):
npm run initDeveloping the project (after brought alive):
Start server with amber serve and go to http://localhost:4000/ in your browser and follow the instructions