document app/dom.js

This commit is contained in:
Martin Zimmermann 2013-10-06 19:55:18 +02:00
parent 382dd3487e
commit 1034d5016e

View File

@ -27,6 +27,10 @@ define(function() {
}; };
window.Element.prototype.on = function(type, listener, prevent) { window.Element.prototype.on = function(type, listener, prevent) {
/*
Shortcut for `Element.addEventListener`, prevents default event
by default, set :param prevents: to `false` to change that behavior.
*/
this.addEventListener(type, function(event) { this.addEventListener(type, function(event) {
listener(); listener();
if (prevent === undefined || prevent) { if (prevent === undefined || prevent) {
@ -36,6 +40,15 @@ define(function() {
}; };
window.Element.prototype.toggle = function(type, on, off) { window.Element.prototype.toggle = function(type, on, off) {
/*
Toggle between two internal states on event :param type: e.g. to
cycle form visibility. Callback :param on: is called on first event,
:param off: next time.
You can skip to the next state without executing the callback with
`toggler.next()`. You can prevent a cycle when you call `toggler.wait()`
during an event.
*/
function Toggle(el, on, off) { function Toggle(el, on, off) {
this.state = false; this.state = false;
@ -70,6 +83,12 @@ define(function() {
}; };
var DOM = function(query, root) { var DOM = function(query, root) {
/*
jQuery-like CSS selector which returns on :param query: either a
single node, a node list or null.
:param root: only queries within the given element.
*/
if (! root) { if (! root) {
root = window.document; root = window.document;
@ -89,6 +108,9 @@ define(function() {
}; };
DOM.htmlify = function(html) { DOM.htmlify = function(html) {
/*
Convert :param html: into an Element (if not already).
*/
if (html instanceof window.Element) { if (html instanceof window.Element) {
return html; return html;
@ -100,6 +122,14 @@ define(function() {
}; };
DOM.new = function(tag, content) { DOM.new = function(tag, content) {
/*
A helper to build HTML with pure JS. You can pass class names and
default content as well:
var par = DOM.new("p"),
div = DOM.new("p.some.classes"),
div = DOM.new("textarea.foo", "...")
*/
var el = document.createElement(tag.split(".")[0]); var el = document.createElement(tag.split(".")[0]);
tag.split(".").slice(1).forEach(function(val) { el.classList.add(val); }); tag.split(".").slice(1).forEach(function(val) { el.classList.add(val); });
@ -109,7 +139,7 @@ define(function() {
} }
if (["TEXTAREA", "INPUT"].indexOf(el.nodeName) > -1) { if (["TEXTAREA", "INPUT"].indexOf(el.nodeName) > -1) {
el.value = content; el.value = content || "";
} else { } else {
el.textContent = content || ""; el.textContent = content || "";
} }
@ -117,6 +147,7 @@ define(function() {
}; };
DOM.each = function(tag, func) { DOM.each = function(tag, func) {
// XXX really needed? Maybe better as NodeList method
Array.prototype.forEach.call(document.getElementsByTagName(tag), func); Array.prototype.forEach.call(document.getElementsByTagName(tag), func);
}; };