oxjs/source/Ox/js/DOM.js

326 lines
10 KiB
JavaScript
Raw Normal View History

2011-11-05 16:46:53 +00:00
'use strict';
/*@
Ox.canvas <function> Generic canvas object
2012-01-04 07:42:48 +00:00
# Description --------------------------------------------------------------
Returns an object with the properties: <code>canvas</code>,
<code>context</code>, <code>data</code> and <code>imageData</code>.
# Usage --------------------------------------------------------------------
Ox.canvas(width, height) -> <object> canvas
Ox.canvas(image) -> <object> canvas
# Arguments ----------------------------------------------------------------
width <n> Width in px
height <n> Height in px
image <e> Image object
@*/
Ox.canvas = function() {
var c = {}, isImage = arguments.length == 1,
image = isImage ? arguments[0] : {
width: arguments[0], height: arguments[1]
};
2012-04-15 12:14:18 +00:00
c.context = (c.canvas = Ox.$('<canvas>').attr({
width: image.width, height: image.height
})[0]).getContext('2d');
isImage && c.context.drawImage(image, 0, 0);
c.data = (c.imageData = c.context.getImageData(
0, 0, image.width, image.height
)).data;
return c;
};
/*@
Ox.documentReady <function> Calls a callback function once the DOM is ready
2012-04-15 12:14:18 +00:00
(callback) -> <b> If true, the document was ready
callback <f> Callback function
@*/
Ox.documentReady = (function() {
var callbacks = [];
document.onreadystatechange = function() {
if (document.readyState == 'complete') {
callbacks.forEach(function(callback) {
callback();
});
}
};
return function(callback) {
if (document.readyState == 'complete') {
callback();
return true;
} else {
callbacks.push(callback);
return false;
}
2011-12-16 23:03:43 +00:00
};
}());
/*@
2012-04-15 12:14:18 +00:00
Ox.$ <f> Generic HTML element, mimics jQuery
(str) -> <o> Element object
str <s> Tagname ('<tagname>') or selector ('tagname', '.classname', '#id')
2012-04-15 19:12:48 +00:00
> Ox.$('<div>').addClass('red').hasClass('red')
true
2012-04-15 19:12:48 +00:00
> Ox.$('<div>').addClass('red').removeClass('red').hasClass('red')
false
2012-04-15 19:12:48 +00:00
> Ox.$('<div>').addClass('red').addClass('red')[0].className
'red'
> Ox.$('<div>').attr({id: 'red'}).attr('id')
'red'
> Ox.$('<div>').attr({id: 'red'}).removeAttr('id').attr('id')
''
> Ox.$('<div>').css({color: 'red'}).css('color')
'red'
> Ox.$('<div>').html('red').html()
'red'
> Ox.$('<div>').html('red').empty().html()
''
> Ox.$('<input>').val('red').val()
'red'
@*/
2012-04-05 15:30:00 +00:00
Ox.$ = Ox.element = function(val) {
// fixme: remove click and mousedown,
2012-03-30 01:41:47 +00:00
// add native css selector
2012-04-05 15:30:00 +00:00
// take all matches of getElementsBy...
var element = Ox.isObject(val) ? val // window or document
2012-04-05 15:30:00 +00:00
: val[0] == '<' ? document.createElement(Ox.sub(val, 1, -1))
: val[0] == '#' ? document.getElementById(Ox.sub(val, 1))
: val[0] == '.' ? document.getElementsByClassName(Ox.sub(val, 1))[0]
: document.getElementsByTagName(val)[0];
return element ? {
//@ 0 <e> The DOM element itself
2012-04-05 15:30:00 +00:00
0: element,
/*@
addClass <f> Adds a class name
(className) -> <o> This element
className <s> Class name
@*/
addClass: function(str) {
2012-04-15 12:14:18 +00:00
this[0].className = Ox.unique(((
this[0].className ? this[0].className + ' ' : ''
) + Ox.clean(str)).split(' ')).join(' ');
return this;
},
/*@
append <f> Appends another element to this element
(element) -> <o> This element
2012-04-15 12:14:18 +00:00
element <o|[o]> One or more elements
@*/
2012-04-15 12:14:18 +00:00
append: function() {
var that = this;
Ox.toArray(arguments[0]).forEach(function(element) {
that[0].appendChild(element[0]);
});
return this;
},
/*@
appendTo <f> appends this element object to another element object
(element) -> <o> This element
element <o> Another element
@*/
appendTo: function(element) {
element[0].appendChild(this[0]);
return this;
},
/*@
attr <f> Gets or sets an attribute
2012-04-15 12:14:18 +00:00
(key) -> <s> Value
(key, value) -> <o> This element
({key: value, key1: value1, ...}) -> <o> This element
key <str> Attribute name
value <str> Attribute value
@*/
attr: function() {
var ret, that = this;
if (arguments.length == 1 && Ox.isString(arguments[0])) {
ret = this[0].getAttribute(arguments[0]);
} else {
Ox.forEach(Ox.makeObject(arguments), function(v, k) {
that[0].setAttribute(k, v);
});
ret = this;
}
return ret;
},
/*@
2012-04-15 12:14:18 +00:00
bind <f> Binds a callback to an event
(event, callback) -> <o> This element
({event0: callback0, event1: callback1, ...}) -> <o> This element
event <s> Event name
callback <f> Callback function
2012-04-15 12:14:18 +00:00
e <o> Event properties
@*/
2012-04-15 12:14:18 +00:00
bind: function() {
var that = this;
Ox.forEach(Ox.makeObject(arguments), function(callback, event) {
that[0].addEventListener(event, callback);
});
return this;
},
/*@
css <f> Gets or sets a CSS attribute
2012-04-15 12:14:18 +00:00
(key) -> <s> Value
(key, value) -> <o> This element
({key0: value0, key1: value1, ...}) -> <o> This element
key <str> Attribute name
value <str> Attribute value
@*/
css: function() {
var ret, that = this;
if (arguments.length == 1 && Ox.isString(arguments[0])) {
ret = this[0].style[arguments[0]];
} else {
Ox.forEach(Ox.makeObject(arguments), function(v, k) {
that[0].style[k] = v;
});
ret = this;
}
return ret;
},
2012-04-15 12:14:18 +00:00
/*@
empty <f> Empties the inner HTML
() -> <o> This element
@*/
2012-04-05 15:30:00 +00:00
empty: function() {
return this.html('');
2012-04-05 15:30:00 +00:00
},
/*@
2012-04-15 12:14:18 +00:00
hasClass <f> Returns true if this element has a given class
(className) -> <b> True if this element has the class
className <s> Class name
@*/
hasClass: function(str) {
return this[0].className.split(' ').indexOf(str) > -1;
},
2012-04-15 12:14:18 +00:00
/*@
height <f> Returns the height of this element
() -> <n> Height in px
@*/
height: function() {
return this[0].offsetHeight;
},
2012-04-15 12:14:18 +00:00
/*@
hide <f> Hides this element
() -> <o> This element
@*/
hide: function() {
return this.css({display: 'none'});
},
/*@
html <f> Gets or sets the inner HTML
2012-04-15 12:14:18 +00:00
() -> <s> The inner HTML
(html) -> <o> This element
html <s> The inner HTML
@*/
html: function(str) {
var ret;
if (Ox.isUndefined(str)) {
ret = this[0].innerHTML;
} else {
this[0].innerHTML = str;
ret = this;
}
return ret;
},
/*@
2012-04-15 12:14:18 +00:00
one <f> Binds a callback to an event and unbinds it on first invocation
(event, callback) -> <o> This element
({event0: callback0, event1: callback1, ...}) -> <o> This element
event <s> Event name
callback <f> Callback function
2012-04-15 12:14:18 +00:00
e <o> Event properties
@*/
2012-04-15 12:14:18 +00:00
one: function(events) {
var that = this;
Ox.forEach(Ox.makeObject(arguments), function(callback, event) {
that.bind(event, function f() {
that.unbind(event, f);
callback();
});
});
return this;
},
2012-04-15 12:14:18 +00:00
/*@
remove <f> Removes this element from the DOM
() -> <o> This element
@*/
2012-04-06 23:45:51 +00:00
remove: function() {
this[0].parentNode.removeChild(this[0]);
return this;
},
/*@
removeAttr <f> Removes an attribute
(key) -> <o> This element
2012-04-15 12:14:18 +00:00
([key0, key1, ...]) -> <o> This element
key <s> The attribute
@*/
2012-04-15 12:14:18 +00:00
removeAttr: function() {
Ox.toArray(arguments[0]).forEach(function(key) {
this[0].removeAttribute(key);
});
return this;
},
/*@
removeClass <f> Removes a class name
(className) -> <o> This element
className <s> Class name
@*/
removeClass: function(str) {
2012-04-15 12:14:18 +00:00
var arr = Ox.clean(str).split(' ');
this[0].className = this[0].className.split(' ').filter(
function(className) {
return arr.indexOf(className) == -1;
}
).join(' ');
return this;
2012-04-05 15:30:00 +00:00
},
2012-04-15 12:14:18 +00:00
/*@
show <f> Show this element
() -> This element
@*/
show: function() {
return this.css({display: 'block'});
},
2012-04-15 12:14:18 +00:00
/*@
unbind <f> Unbinds a callback from an event
(event) -> <o> This element (unbinds all callbacks)
(event, callback) -> <o> This element
({event0: callback0, event1: callback1, ...}) -> <o> This element
event <s> Event name
callback <f> Callback function
@*/
unbind: function(event, callback) {
var that = this;
Ox.forEach(Ox.makeObject(arguments), function(callback, event) {
if (callback) {
that[0].removeEventListener(event, callback);
} else {
that[0]['on' + event] = null;
}
});
2012-04-05 15:30:00 +00:00
return this;
},
2012-04-15 12:14:18 +00:00
/*@
val <f> Gets or sets the value property of this element
() -> <s> Value
(value) -> <o> This element
value <s> Value
@*/
2012-04-14 09:45:19 +00:00
val: function() {
var ret;
if (arguments.length == 0) {
return this[0].value;
} else {
this[0].value = arguments[0];
ret = this;
}
return ret;
},
2012-04-15 12:14:18 +00:00
/*@
width <f> Returns the width of this element
() -> <n> Width in px
@*/
width: function() {
return this[0].offsetWidth;
}
2012-04-05 15:30:00 +00:00
} : null;
};