Skip to content

Commit b11f4a7

Browse files
author
Shallker Wang
committed
First commit
0 parents  commit b11f4a7

11 files changed

+337
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
components
2+
build

History.md

Whitespace-only changes.

Makefile

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
build: components index.js lib/*.js
3+
@component build --dev
4+
@touch build/done
5+
@rm build/done
6+
@echo build done
7+
8+
components: component.json
9+
@component install --dev
10+
11+
clean:
12+
rm -fr build components template.js
13+
14+
.PHONY: clean

Readme.md

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
# object-element
3+
4+
The base abstraction of object element
5+
6+
## Installation
7+
8+
Install with [component(1)](http://component.io):
9+
10+
$ component install object-element/object-element
11+
12+
## API
13+
### objectElement
14+
#### Properties
15+
##### .width
16+
Get or set by pixels, offsetWidth
17+
18+
##### .height
19+
Get or set by pixels, offsetHeight
20+
21+
##### .id
22+
##### .tag
23+
##### .text
24+
##### .html
25+
26+
27+
## License
28+
29+
MIT

component.json

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"name": "object-element",
3+
"repo": "object-element/object-element",
4+
"description": "The base abstraction of object element",
5+
"version": "0.0.1",
6+
"keywords": [],
7+
"dependencies": {
8+
"component/domify": "*"
9+
},
10+
"development": {
11+
"shallker/simple-test": "*",
12+
"shallker/dom-helper": "*"
13+
},
14+
"license": "MIT",
15+
"main": "index.js",
16+
"scripts": [
17+
"index.js",
18+
"lib/events.js",
19+
"lib/object-element.js"
20+
]
21+
}

index.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = require('./lib/object-element');

lib/events.js

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
module.exports = Events;
2+
3+
function Events() {}
4+
5+
Events.prototype.on = function (eventname, callback) {
6+
if (typeof this.eventsRegistry[eventname] === 'undefined') {
7+
this.eventsRegistry[eventname] = [];
8+
}
9+
10+
return this.eventsRegistry[eventname].push(callback);
11+
}
12+
13+
Events.prototype.off = function (eventname, callback) {
14+
var i, callbacks = this.eventsRegistry[eventname];
15+
16+
if (callbacks === 'undefined') {
17+
return false;
18+
}
19+
20+
for (i = 0; i < callbacks.length; i++) {
21+
if (callbacks[i] === callback) {
22+
return callbacks.splice(i, 1);
23+
}
24+
}
25+
26+
return false;
27+
}
28+
29+
Events.prototype.trigger = function (eventname, args) {
30+
args = slice.call(arguments);
31+
eventname = args.shift();
32+
33+
var callbacks = this.eventsRegistry[eventname];
34+
var host = this;
35+
36+
if (callbacks === 'undefined') {
37+
return this;
38+
}
39+
40+
callbacks.forEach(function (callback, index) {
41+
setTimeout(function () {
42+
callback.apply(host, args);
43+
}, 0);
44+
});
45+
46+
return this;
47+
}
48+
49+
Events.prototype.triggerSync = function (eventname, args) {
50+
args = slice.call(arguments);
51+
eventname = args.shift();
52+
53+
var callbacks = this.eventsRegistry[eventname];
54+
var host = this;
55+
56+
if (callbacks === 'undefined') {
57+
return this;
58+
}
59+
60+
callbacks.forEach(function (callback, index) {
61+
callback.apply(host, args);
62+
});
63+
64+
return this;
65+
}

lib/object-element.js

+131
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
var domify = require('domify');
2+
var Events = require('./events');
3+
var slice = Array.prototype.slice;
4+
5+
module.exports = ObjectElement;
6+
7+
function ObjectElement(param) {
8+
var element, eventsRegistry = {};
9+
10+
if (typeof param === 'undefined' || param === null) {
11+
element = document.createElement('div');
12+
} else if (typeof param === 'string') {
13+
element = document.createElement(param);
14+
} else if (typeof param === 'object') {
15+
element = param;
16+
}
17+
18+
Object.defineProperty(this, 'element', {
19+
get: function () {
20+
return element;
21+
},
22+
23+
set: function (value) {
24+
element = value;
25+
}
26+
});
27+
28+
Object.defineProperty(this, 'eventsRegistry', {
29+
get: function () {
30+
return eventsRegistry
31+
}
32+
});
33+
}
34+
35+
/**
36+
* Wrap HTMLElement with ObjectElement
37+
* @param {HTMLElement element}
38+
* @return {ObjectElement}
39+
*/
40+
ObjectElement.wrapElement = function (element) {
41+
return element.OBJECT_ELEMENT ? element : new ObjectElement(element);
42+
}
43+
44+
/**
45+
* Loop through HTMLElements and wrap each of them with ObjectElement
46+
* @param {Array elements}
47+
* @return {Array}
48+
*/
49+
ObjectElement.wrapElements = function (elements) {
50+
elements = slice.call(elements);
51+
52+
return elements.map(function (element, i) {
53+
return ObjectElement.wrapElement(element);
54+
});
55+
}
56+
57+
ObjectElement.createElement = function (tag) {
58+
tag = tag || 'div';
59+
60+
return this.wrapElement(document.createElement(tag));
61+
}
62+
63+
ObjectElement.prototype = new Events;
64+
65+
ObjectElement.prototype.defineProperty = function (name, defines) {
66+
Object.defineProperty(this, name, defines);
67+
}
68+
69+
ObjectElement.prototype.defineProperty('OBJECT_ELEMENT', {
70+
get: function () {
71+
return 1;
72+
}
73+
});
74+
75+
/**
76+
* Shortcut to .element.id
77+
*/
78+
ObjectElement.prototype.defineProperty('id', {
79+
get: function () {
80+
return this.element.id;
81+
},
82+
83+
set: function (value) {
84+
this.element.id = value;
85+
}
86+
});
87+
88+
/**
89+
* Shortcut to .element.tagName
90+
*/
91+
ObjectElement.prototype.defineProperty('tag', {
92+
get: function () {
93+
return this.element.tagName;
94+
}
95+
});
96+
97+
/**
98+
* Get or set textContent of the element
99+
*/
100+
ObjectElement.prototype.defineProperty('text', {
101+
get: function () {
102+
return this.element.textContent;
103+
},
104+
105+
set: function (value) {
106+
this.element.textContent = value;
107+
}
108+
});
109+
110+
/**
111+
* Get or set innerHTML of the element
112+
*/
113+
ObjectElement.prototype.defineProperty('html', {
114+
get: function () {
115+
return this.element.innerHTML;
116+
},
117+
118+
set: function (htmlString) {
119+
this.element.innerHTML = '';
120+
this.element.appendChild(domify(htmlString));
121+
}
122+
});
123+
124+
/**
125+
* Call a function on this element
126+
* @param {Function callback}
127+
* @return {Null}
128+
*/
129+
ObjectElement.prototype.tie = function (callback) {
130+
callback.call(this, this.element);
131+
}

start.json

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"server": {
3+
"port": 3000,
4+
"host": "./"
5+
},
6+
"liverefresh": "./"
7+
}

test/methods.html

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Test</title>
5+
</head>
6+
<body>
7+
<script src="/build/build.js"></script>
8+
<script>
9+
var ObjectElement = require('object-element');
10+
var test = require('simple-test');
11+
var dom = require('dom-helper');
12+
13+
test('objectElement.tie(callback)', function () {
14+
var div = dom.insertDiv();
15+
var objectDiv = new ObjectElement(div);
16+
17+
objectDiv.tie(function (el) {
18+
test.eq(el, div);
19+
test.eq(this, objectDiv);
20+
});
21+
22+
dom.remove(div);
23+
});
24+
</script>
25+
</body>
26+
</html>

test/properties.html

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Test</title>
5+
</head>
6+
<body>
7+
<script src="/build/build.js"></script>
8+
<script>
9+
var ObjectElement = require('object-element');
10+
var test = require('simple-test');
11+
var dom = require('dom-helper');
12+
13+
test('objectElement.id', function () {
14+
var div = dom.insertDiv();
15+
var objectDiv = new ObjectElement(div);
16+
17+
objectDiv.id = 'test';
18+
test.eq(div.id, 'test');
19+
dom.remove(div);
20+
});
21+
22+
test('objectElement.text', function () {
23+
var div = dom.insertDiv();
24+
var objectDiv = new ObjectElement(div);
25+
26+
objectDiv.text = '.text';
27+
test.eq(div.textContent, '.text');
28+
dom.remove(div);
29+
});
30+
31+
test('objectElement.html', function () {
32+
var div = dom.insertDiv();
33+
var objectDiv = new ObjectElement(div);
34+
35+
objectDiv.html = '<div>html</div>';
36+
dom.remove(div);
37+
});
38+
39+
</script>
40+
</body>
41+
</html>

0 commit comments

Comments
 (0)