febs
Version:
febs is a useful utilities set
1,554 lines (1,367 loc) • 38.9 kB
JavaScript
var Window = "undefined" != typeof window ? window : ("undefined" != typeof global ? global : ("undefined" != typeof self ? self : undefined));
var utils = require('./utils');
var stringUtils = require('./string');
// - parentNodes 父节点 (HTMLNode)
// - name 子节点selector.
// - notAllChildren 仅查询一层子节点.
// 返回匹配到的元素集合.
function _matchElement(parentNodes, name, notAllChildren) {
var elems;
var tag = 0; // 0-tag, 1-id, 2-class.
var nameattr, nameattrVal;
// :checked, :disabled
var selector = name.split(':');
name = selector[0];
name = stringUtils.trim(name);
selector = selector[1];
if (selector) {
if (selector != 'checked' && selector != 'disabled') {
throw new Error('only support `:checked or :disabled` selector');
}
}
// attri.
if (name.indexOf('[') > 0) {
var iblace = name.indexOf('[');
nameattr = name.substring(iblace+1, name.length-1);
nameattr = nameattr.split('=');
if (nameattr.length != 2) {
throw new Error('Syntax error, unrecognized expression: ' + name);
}
nameattrVal = nameattr[1];
if (nameattrVal.indexOf('\'') >= 0 || nameattrVal.indexOf('"') >= 0)
nameattrVal = nameattrVal.substring(1, nameattrVal.length-1);
nameattr = nameattr[0];
name = name.substr(0, iblace);
}
if (name[0] == '.') {
tag = 2;
name = name.substr(1);
}
else if (name[0] == '#') {
tag = 1;
name = name.substr(1);
}
if (!parentNodes || parentNodes.length == 0) {
if (2 == tag) {
elems = Window.document.getElementsByClassName(name);
}
else if (1 == tag) {
elems = Window.document.getElementById(name);
if (elems) elems = [elems];
else elems = [];
}
else if (0 == tag) {
elems = Window.document.getElementsByTagName(name);
}
// attrvalue.
if (nameattr) {
var tt_elems = elems;
elems = [];
for (var i = 0; i < tt_elems.length; i++) {
if (tt_elems[i].getAttribute(nameattr) === nameattrVal) {
elems.push(tt_elems[i]);
}
}
} // if.
if (selector) {
var tt_elems = elems;
elems = [];
for (var i = 0; i < tt_elems.length; i++) {
if (selector == 'disabled') {
if (tt_elems[i].disabled) {
elems.push(tt_elems[i]);
}
}
else
if (selector == 'checked') {
if (tt_elems[i].checked) {
elems.push(tt_elems[i]);
}
}
}
} // if.
}
else {
elems = [];
for (var i = 0; i < parentNodes.length; i++) {
var node1 = parentNodes[i].childNodes;
if (!node1) continue;
var node = [];
for (var j = 0; j < node1.length; j++) {
node.push(node1[j]);
}
for (var j = 0; j < node.length; j++) {
var add = true;
if (selector) {
if (selector == 'disabled') {
if (!node[j].disabled) {
add = false;
}
}
else
if (selector == 'checked') {
if (!node[j].checked) {
add = false;
}
}
} // if.
// attrvalue.
if (add && nameattr) {
if (node[j].getAttribute(nameattr) !== nameattrVal) {
add = false;
}
}
if (add) {
if (2 == tag) {
if (_hasClass(node[j], name)) {
elems.push(node[j]);
continue;
}
}
else if (1 == tag) {
if (node[j].id == name) {
elems.push(node[j]);
continue;
}
}
else if (0 == tag) {
if (node[j].nodeName.toUpperCase() == name.toUpperCase()) {
elems.push(node[j]);
continue;
}
}
} // if.
if (!notAllChildren) {
var nn = node[j].childNodes;
if (nn && nn.length > 0) {
for (var k = 0; k < nn.length; k++) {
node.push(nn[k]);
}
if (j > 20) {
node = node.slice(j+1);
j = -1;
}
}
}
} // for.
} // for.
} // if..else.
return elems;
}
// - parentNode 仅筛选此节点下的节点.
function _getElement(name, parentNode) {
if (name === '') name = null;
var _elem;
var _isarr = false;
if (typeof name === 'string') {
if (name[0] == '<') {
_elem = Window.document.createElement('div');
_elem.innerHTML = name;
if (_elem.childNodes.length == 1) {
_elem = _elem.childNodes[0];
_isarr = false;
}
else {
_elem = _elem.childNodes;
_isarr = true;
}
}
else {
if (name.indexOf('<') > 0 || name.indexOf('>') > 0)
throw new Error('Syntax error, unrecognized');
var names = name.split(' ');
var nodes = parentNode ? [parentNode] : null;
for (var i = 0; i < names.length; i++) {
if (names[i] != '')
nodes = _matchElement(nodes, names[i], !!parentNode);
}
if (nodes.length <= 1) {
_elem = nodes[0];
_isarr = false;
} else {
_elem = nodes;
_isarr = true;
}
}
} else {
_elem = name;
}
return {_elem:_elem, _isarr:_isarr};
}
/**
* hasClass
*/
function _hasClass( element, cName ){
if (!element || !element.className || (typeof element.className.match !== 'function'))
return false;
return !!element.className.match( new RegExp( "(\\s|^)" + cName + "(\\s|$)") ); // ( \\s|^ ) 判断前面是否有空格 (\\s | $ )判断后面是否有空格 两个感叹号为转换为布尔值 以方便做判断
}
/**
* addClass
*/
function _addClass( element,cName ){
if (!element) return;
if (typeof element.className === 'string') {
if( !_hasClass( element,cName ) ){
if (stringUtils.isEmpty(element.className))
element.className += cName;
else
element.className += " " + cName;
};
}
}
/**
* removeClass
*/
function _removeClass( element, cName ){
if (!element) return;
if (typeof element.className === 'string') {
if( _hasClass( element,cName ) ){
element.className = element.className.replace( new RegExp( "(\\s|^)" + cName + "(\\s|$)" )," " ); // replace方法是替换
// trim.
element.className = stringUtils.trim(element.className);
};
}
}
/**
* removeElement
*/
function _removeElement(element){
if (element) {
var _parentElement = element.parentNode;
if(_parentElement){
_parentElement.removeChild(element);
}
}
}
/**
* appendChild
*/
function _appendChild(element, node) {
if (element) {
if (node instanceof Dom) {
if (!node._isArray()) {
element.appendChild(node[0]);
} else {
for (var i = 0; i < node.length; i++) {
element.appendChild(node[i]);
}
}
}
else {
element.appendChild(node);
}
}
}
function _prependChild(element,node){
if (!element) return;
if(element.hasChildNodes()){
if (node instanceof Dom) {
if (!node._isArray()) {
element.insertBefore(node[0], element.firstChild);
} else {
for (var i = node.length-1; i >= 0; i--) {
element.insertBefore(node[i], element.firstChild);
}
}
} else {
element.insertBefore(node, element.firstChild);
}
} else{
if (node instanceof Dom) {
if (!node._isArray()) {
element.appendChild(node[0]);
} else {
for (var i = 0; i < node.length; i++) {
element.appendChild(node[i]);
}
}
} else {
element.appendChild(node);
}
}
}
function _isHtmlElement(obj) {
var d = document.createElement("div");
try{
d.appendChild(obj.cloneNode(true));
return obj.nodeType==1 ? true : false;
}catch(e){
return obj==Window || obj==document;
}
}
var CreateDom;
/**
* @desc 类jquery dom操作.
*/
class Dom {
// _elem;
// _isArr;
/**
* 支持
* - .name 使用类名构建.
* - #name 使用id名构建.
* - name 使用tag名构建.
* - <div...>...</div> 使用内容构建.
* - node.
*/
constructor(name) {
//
// save in '_elem', '_isArr'
//
if (name === Window.document || name == Window) {
this._elem = name;
this._isArr = false;
}
else if (name instanceof Dom) {
this._elem = name._elem;
this._isArr = name._isArr;
} else {
if (_isHtmlElement(name)) {
this._elem = name;
this._isArr = false;
}
else {
this._elem = _getElement(name);
this._isArr = this._elem._isarr;
this._elem = this._elem._elem;
}
}
if (!this._isArray()) {
this[0] = this._elem;
this.length = this._elem ? 1 : 0;
} else {
for (var i = 0; i < this._elem.length; i++) {
this[i] = this._elem[i];
}
this.length = this._elem.length;
}
var _this = this;
this.bind = this.on;
this.unbind = this.off;
this.live = this.on;
this.die = this.off;
if (name === Window.document) {
this.ready = function(f) { if (f) {
if (Window.addEventListener)
Window.document.addEventListener('DOMContentLoaded', f);
else
Window.document.attachEvent('onload', f);
}
else {
_this.trigger('ready');
}
return _this;
}
this.unload = function(f) { if (f) {
if (Window.addEventListener)
Window.document.addEventListener('unload', f);
else
Window.document.attachEvent('onunload', f);
}
else {
_this.trigger('unload');
}
return _this;
}
this.context = Window.document;
}
else if (name === Window) {
this.unload = function(f) { if (f) {
if (Window.addEventListener)
Window.addEventListener('unload', f);
else
Window.attachEvent('onunload', f);
}
else {
_this.trigger('unload');
}
return _this;
}
}
else {
this.context = Window.document;
}
if (typeof name === 'function') {
function foo(e){
name.bind(_this)(e);
if (Window.addEventListener)
Window.document.removeEventListener('DOMContentLoaded', foo);
else
Window.document.detachEvent('onload', foo);
}
if (Window.addEventListener)
Window.document.addEventListener('DOMContentLoaded', foo);
else
Window.document.attachEvent('onload', foo);
}
else {
function ttt(event, f) {
if (f) {
return _this.on(event, f);
} else {
return _this.trigger(event);
}
}
this.blur = function(f) { return ttt('blur', f); }
this.change = function(f) { return ttt('change', f); }
this.click = function(f) { return ttt('click', f); }
this.dblclick = function(f) { return ttt('dblclick', f); }
this.error = function(f) { return ttt('error', f); }
this.keydown = function(f) { return ttt('keydown', f); }
this.keypress = function(f) { return ttt('keypress', f); }
this.keyup = function(f) { return ttt('keyup', f); }
this.load = function(f) { return ttt('load', f); }
this.mousedown = function(f) { return ttt('mousedown', f); }
this.mouseenter = function(f) { return ttt('mouseenter', f); }
this.mouseleave = function(f) { return ttt('mouseleave', f); }
this.mousemove = function(f) { return ttt('mousemove', f); }
this.mouseout = function(f) { return ttt('mouseout', f); }
this.mouseover = function(f) { return ttt('mouseover', f); }
this.mouseup = function(f) { return ttt('mouseup', f); }
this.scroll = function(f) { return ttt('scroll', f); }
this.select = function(f) { return ttt('select', f); }
this.submit = function(f) { return ttt('submit', f); }
}
if (this._elem) {
if (this._isArray()) {
for (var i = 0; i < this._elem.length; i++) {
this._domtify(this._elem[i]);
}
} else {
this._domtify(this._elem);
}
}
// plugin.
for (var key in CreateDom.fn) {
if (key == 'extend' || key == 'fn') continue;
if (typeof CreateDom.fn[key] === 'function') {
this[key] = CreateDom.fn[key].bind(this);
}
}
this.__domtify = true;
}
get(index) {
if (!this._elem) return null;
else {
if (this._isArray()) {
return this._elem[index];
}
else {
return index > 0 ? null : this._elem;
}
}
}
/**
* @desc: hasClass
*/
hasClass( cName ){
if (!this._elem) { return false; }
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
if (_hasClass(this.get(i), cName)) return true;
}
return false;
}
/**
* @desc: addClass
*/
addClass( cName ){
if (!this._elem) { return this; }
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
_addClass(this.get(i), cName);
}
return this;
}
/**
* @desc: removeClass
*/
removeClass( cName ){
if (!this._elem) { return this; }
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
_removeClass(this.get(i), cName);
}
return this;
}
/**
* @desc: toggleClass
*/
toggleClass( cName ){
if (!this._elem) { return this; }
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
if (_hasClass(this.get(i), cName))
_removeClass(this.get(i), cName);
else
_addClass(this.get(i), cName);
}
return this;
}
/**
* @desc: remove
*/
remove(){
if (!this._elem) { return this; }
var _thisLength = (this.length) ? this.length : 1;
for (var i = _thisLength-1; i >= 0; i--) {
_removeElement(this.get(i));
}
return this;
}
/**
* @desc: append
*/
append(node) {
if (!this._elem) { return this; }
var _dom = new Dom(node);
_appendChild(this.get(0), _dom);
return this;
}
/**
* appendTo
*/
appendTo(node) {
if (!this._elem) { return this; }
var dom = new Dom(node);
dom.append(this);
return this;
}
/**
* @desc: prepend
*/
prepend(node) {
if (!this._elem) { return this; }
var _dom = new Dom(node);
_prependChild(this.get(0), _dom);
return this;
}
/**
* @desc: prependTo
*/
prependTo(node) {
if (!this._elem) { return this; }
var dom = new Dom(node);
dom.prepend(this);
return this;
}
/**
* @desc: before
*/
before(node) {
if (!this._elem) { return this; }
var _dom = new Dom(node);
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
_dom.insertBefore(this.get(i));
}
return this;
}
/**
* insertBefore
*/
insertBefore(node) {
if (!this._elem) { return this; }
var dom = new Dom(node);
if (!dom._isArray()) {
var elem = this._elem;
if (!this._isArray()) elem = [elem];
for (var i = 0; i < elem.length; i++) {
dom[0].parentNode.insertBefore(elem[i], dom[0]);
}
}
return this;
}
/**
* @desc: after
*/
after(node) {
if (!this._elem) { return this; }
var _dom = new Dom(node);
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
_dom.insertAfter(this.get(i));
}
return this;
}
/**
* @desc: insertAfter
*/
insertAfter(node) {
if (!this._elem) { return this; }
var dom = new Dom(node);
if (!dom._isArray()) {
var elem = this._elem;
if (!this._isArray()) elem = [elem];
for (var i = 0; i < elem.length; i++) {
dom[0].parentNode.insertBefore(elem[i], dom[0].nextSibling);
}
}
return this;
}
/**
* @desc: attr.
*/
attr(attrName, value) {
if (!attrName) {
throw new Error('need attrName');
}
if (!this._elem) {
if (typeof value !== 'undefined')
return this;
return undefined;
}
if (typeof value === 'undefined') {
if (!this.get(0).hasAttribute(attrName))
return undefined;
return this.get(0).getAttribute(attrName);
} else {
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
this.get(i).setAttribute(attrName, value);
}
return this;
}
}
/**
* @desc: removeAttr
*/
removeAttr(name) {
if (!this._elem) { return this; }
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
this.get(i).removeAttribute(name);
}
return this;
}
/**
* @desc: detach.
*/
detach() {
throw new Error('unimplement');
}
/**
* @desc: clone.
*/
clone() {
throw new Error('unimplement');
}
/**
* @desc: replaceAll.
*/
replaceAll() {
throw new Error('unimplement');
}
/**
* @desc: replaceWith.
*/
unwrap() {
throw new Error('unimplement');
}
/**
* @desc: replaceWith.
*/
wrap() {
throw new Error('unimplement');
}
/**
* @desc: replaceWith.
*/
wrapAll() {
throw new Error('unimplement');
}
/**
* @desc: replaceWith.
*/
wrapinner() {
throw new Error('unimplement');
}
/**
* @desc: empty.
*/
empty() {
if (!this._elem) { return this; }
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
this.get(i).innerHTML = '';
}
return this;
}
/**
* @desc: html.
*/
html(v) {
if (!this._elem) {
if (typeof v !== 'undefined')
return this;
return;
}
if (typeof v === 'undefined') {
return this.get(0).innerHTML;
} else {
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
this.get(i).innerHTML = v;
}
return this;
}
}
/**
* @desc: text.
*/
text(v) {
if (!this._elem) {
if (typeof v !== 'undefined')
return this;
return;
}
if (typeof v === 'undefined') {
return this.get(0).textContent;
} else {
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
this.get(i).textContent = v;
}
return this;
}
}
/**
* @desc: val.
*/
val(v) {
if (!this._elem) {
if (typeof v !== 'undefined')
return this;
return;
}
if (typeof v === 'undefined') {
return this.get(0).value;
} else {
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
this.get(i).value = v;
}
return this;
}
}
/**
* @desc: css.
*/
css(name, value) {
if (!this._elem) {
if (typeof value !== 'undefined')
return this;
return;
}
if (typeof value === 'undefined') {
return this.get(0).style[name];
} else {
var _thisLength = (this.length) ? this.length : 0;
for (var i = 0; i < _thisLength; i++) {
if (value == '')
this.get(i).style[name] = '';
else
this.get(i).style[name] = value;
}
return this;
}
}
/**
* @desc: on.
*/
on(eventname, foo) {
if (!eventname)
throw new Error('need event name');
if (typeof foo !== 'function')
throw new Error('on need function params');
if (!this._elem) { return this; }
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
var ee = this.get(i);
if (ee instanceof Dom || ee.__domtify) {
ee = ee._elem;
if (!ee) {
continue;
}
}
if (!ee.__events) ee.__events = {};
if (!ee.__events[eventname]) ee.__events[eventname] = [];
var env = ee.__events[eventname];
var j;
for (j = 0; j < env.length; j++) {
if (env[j] === foo) {
break;
}
}
if (j >= env.length) {
env.push(foo);
}
if ('on'+eventname in ee) {
if (ee.addEventListener)
ee.addEventListener(eventname, foo);
else
ee.attachEvent('on'+eventname, foo);
}
}
return this;
}
/**
* @desc: one.
*/
one(event, f) {
if (!event || typeof event !== 'string')
throw new Error('need event name');
var _this = this;
var tt = function(e) { _this.off(event, tt); f.bind(this)(e); };
_this.on(event, tt);
return this;
}
/**
* @desc: off.
*/
off(eventname, foo) {
if (!eventname)
throw new Error('need event name');
if (!this._elem) { return this; }
if (!foo) {
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
var ee = this.get(i);
if (ee instanceof Dom || ee.__domtify) {
ee = ee._elem;
if (!ee) {
continue;
}
}
if (ee.__events && ee.__events[eventname])
{
var env = ee.__events[eventname];
var j;
if ('on'+eventname in ee) {
for (j = 0; j < env.length; j++) {
if (ee.removeEventListener)
ee.removeEventListener(eventname, env[j]);
else
ee.detachEvent('on'+eventname, env[j]);
}
}
ee.__events[eventname] = [];
}
}
return this;
}
if (typeof foo !== 'function')
throw new Error('off need function params');
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
var ee = this.get(i);
if (ee instanceof Dom) {
ee = ee._elem;
}
if (ee.__events && ee.__events[eventname])
{
var env = ee.__events[eventname];
var j;
for (j = 0; j < env.length; j++) {
if (env[j] === foo) {
env.splice(j, 1);
break;
}
}
}
if ('on'+eventname in ee) {
if (ee.removeEventListener)
ee.removeEventListener(eventname, foo);
else
ee.detachEvent('on'+eventname, foo);
}
}
return this;
}
/**
* @desc: trigger.
*/
trigger(eventname, extraParameters) {
if (!eventname)
throw new Error('need event name');
if (!this._elem) { return this; }
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
var ee = this.get(i);
if (ee instanceof Dom) {
ee = ee._elem;
}
// fire.
if (ee) {
if ('on'+eventname in ee) {
if (!Window.document.addEventListener) {
ee.fireEvent('on'+eventname);
}
else {
var env = Window.document.createEvent('HTMLEvents');
env.initEvent(eventname, true, true);
ee.dispatchEvent(env);
}
}
else {
if (ee.__events && ee.__events[eventname])
{
var env = ee.__events[eventname];
var j;
var enve;
// if (!Window.document.addEventListener) {
enve = {
bubbles: false,
cancelable: false,
cancelBubble: false,
defaultPrevented: false,
// currentTarget: ee,
// target: ee,
type: eventname
};
// }
// else {
// enve = Window.document.createEvent('HTMLEvents');
// enve.initEvent(eventname, false, false);
// }
enve.currentTarget = ee;
enve.target = ee;
for (j = 0; j < env.length; j++) {
env[j](enve, extraParameters);
}
} // if.
}
} // if.
}
return this;
}
/**
* @desc: parent
* @return:
*/
parent(selector) {
if (!this._elem) { return new Dom(); }
var sel;
if (selector)
sel = new Dom(selector);
if (this._isArray()) {
var dom = new Dom();
dom._elem = [];
dom._isArr = true;
dom.length = 0;
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
if (this.get(i).parentNode) {
if (!sel || sel._isElementIn(this.get(i).parentNode)) {
this._domtify(this.get(i).parentNode);
dom._elem.push(this.get(i).parentNode);
dom[dom.length] = this.get(i).parentNode;
dom.length++;
}
}
}
if (dom._elem.length == 0) dom._elem = null;
return dom;
} else {
if (!this._elem.parentNode) return new Dom();
if (!sel || sel._isElementIn(this._elem.parentNode)) {
return new Dom(this._elem.parentNode);
}
return new Dom();
} // if.
}
/**
* @desc: parents
* @return:
*/
parents(selector) {
if (!this._elem) { return new Dom(); }
var sel;
if (selector)
sel = new Dom(selector);
var nodes = [];
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
if (!this.get(i).parentNode) continue;
var elem = this.get(i);
while (elem.parentNode) {
if (elem.parentNode == Window || elem.parentNode == Window.document)
break;
if (!sel || sel._isElementIn(elem.parentNode)) {
var j;
for (j = 0; j < nodes.length; j++) {
if (typeof nodes[j].isSameNode === 'function') {
if (nodes[j].isSameNode(elem.parentNode)) {
break;
}
}
else {
if (nodes[j] === elem.parentNode) {
break;
}
}
}
if (j >= nodes.length)
nodes.push(elem.parentNode);
}
elem = elem.parentNode;
}
} // for.
var dom = new Dom();
if (nodes.length > 0) {
dom._elem = nodes;
dom._isArr = true;
dom.length = nodes.length;
for (var i = 0; i < nodes.length; i++) {
dom._domtify(nodes[i]);
dom[i] = nodes[i];
}
}
return dom;
}
/**
* children
* @param {*} selector
*/
children(selector) {
if (!this._elem) { return new Dom(); }
var nodes = [];
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
var sel;
if (selector)
sel = _getElement(selector, this.get(i));
else {
sel = {_elem: [], _isarr: true};
for (var j = 0; j < this.get(i).childNodes.length; j++) {
sel._elem.push(this.get(i).childNodes[j]);
}
}
if (!sel._elem)
continue;
if (sel._isarr) {
nodes = nodes.concat(sel._elem);
} else {
nodes.push(sel._elem);
}
}
var dom = new Dom();
dom._elem = nodes;
dom._isArr = true;
dom.length = nodes.length;
for (var i = 0; i < nodes.length; i++) {
this._domtify(nodes[i]);
dom[i] = nodes[i];
}
return dom;
}
/**
* next
* @param {*} selector
*/
next(selector) {
if (!this._elem) { return new Dom(); }
var dom;
if (selector) {
dom = this.parent();
dom = dom.children(selector);
}
if (this._isArray()) {
var nodes = [];
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
if (!dom || dom._isElementIn(this.get(i).nextSibling)) {
if (this.get(i).nextSibling)
nodes.push(this.get(i).nextSibling);
}
}
var dom1 = new Dom();
dom1._elem = nodes;
dom1._isArr = true;
dom1.length = nodes.length;
for (var i = 0; i < nodes.length; i++) {
this._domtify(nodes[i]);
dom1[i] = nodes[i];
}
return dom1;
}
else {
var nodes;
if (!dom || dom._isElementIn(this._elem.nextSibling)) {
if (this._elem.nextSibling)
nodes = this._elem.nextSibling;
}
var dom1 = new Dom();
dom1._elem = nodes;
dom1[0] = nodes;
dom1._isArr = false;
dom1.length = nodes ? 1 : 0;
return dom1;
} // if..else
}
/**
* prev
* @param {*} selector
*/
prev(selector) {
if (!this._elem) { return new Dom(); }
var dom;
if (selector) {
dom = this.parent();
dom = dom.children(selector);
}
if (this._isArray()) {
var nodes = [];
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
if (!dom || dom._isElementIn(this.get(i).previousSibling)) {
if (this.get(i).previousSibling)
nodes.push(this.get(i).previousSibling);
}
}
var dom1 = new Dom();
dom1._elem = nodes;
dom1._isArr = true;
dom1.length = nodes.length;
for (var i = 0; i < nodes.length; i++) {
this._domtify(nodes[i]);
dom1[i] = nodes[i];
}
return dom1;
}
else {
var nodes;
if (!dom || dom._isElementIn(this._elem.previousSibling)) {
if (this._elem.previousSibling)
nodes = this._elem.previousSibling;
}
var dom1 = new Dom();
dom1._elem = nodes;
dom1[0] = nodes;
dom1._isArr = false;
dom1.length = nodes ? 1 : 0;
return dom1;
} // if..else
}
/**
* @desc: 遍历
*/
each(cb) {
if (cb) {
for (var i = 0; i < this.length; i++) {
cb(i, this.get(i));
}
}
}
// 将普通节点设置为Dom对象.
_domtify(node) {
if (node instanceof Dom)
return;
if (node.__domtify)
return;
var _proto = Object.getPrototypeOf(this);
for (var key in _proto) {
if (key != '__proto__' && key != 'constructor') {
// 不覆盖native方法.
if (!node[key]) {
node[key] = _proto[key].bind(node);
}
}
}
// // plugin.
for (var key in CreateDom.fn) {
if (key == 'extend' || key == 'fn') continue;
if (typeof CreateDom.fn[key] === 'function') {
if (!node[key]) {
node[key] = CreateDom.fn[key].bind(node);
}
}
}
// delete node.length;
node._isArr = false;
node._elem = node;
// node[0] = node;
node.__domtify = true;
}
// 当前是否是数组.
_isArray() {
return this._isArr;
}
// 指定节点是否存在于本对象中.
_isElementIn(node) {
if (!this._elem) return false;
var _thisLength = (this.length) ? this.length : 1;
for (var i = 0; i < _thisLength; i++) {
if (typeof this.get(i).isSameNode === 'function') {
if (this.get(i).isSameNode(node))
return true;
}
else {
if (this.get(i) === node)
return true;
}
}
return false;
}
};
CreateDom = function(n) {
return new Dom(n);
}
// plugin.
CreateDom.fn = {};
CreateDom.extend = function(plugin) {
if (arguments.length == 0)
return {}
if (arguments.length == 1) {
for (var key in arguments[0]) {
if (key == 'extend' || key == 'fn') continue;
if (typeof arguments[0][key] === 'function') {
CreateDom[key] = arguments[0][key];
}
}
return this;
}
else {
if (arguments[0] === false )
throw new Error('can\'t be false');
var o = {};
var i = 0;
if (arguments[0] === true )
i = 1;
for (; i < arguments.length; i++) {
o = utils.mergeMap(o, arguments[i]);
}
return o;
} // if..else.
}
/**
* @desc: viewport.
* @return: {width, height}
*/
Dom.getViewPort = function() {
if(Window.document.compatMode == "BackCompat") { //浏览器嗅探,混杂模式
return {
width: Window.document.body.clientWidth,
height: Window.document.body.clientHeight
};
} else {
return {
width: Window.document.documentElement.clientWidth,
height: Window.document.documentElement.clientHeight
};
}
}
/**
* @desc: documentport.
* @return: {width, height}
*/
Dom.getDocumentPort = function() {
if(Window.document.compatMode == "BackCompat") {
return {
width: Window.document.body.scrollWidth,
height: Window.document.body.scrollHeight
};
} else {
return {
width: Math.max(Window.document.documentElement.scrollWidth,Window.document.documentElement.clientWidth),
height: Math.max(Window.document.documentElement.scrollHeight,Window.document.documentElement.clientHeight)
}
}
}
/**
* @desc: document offset.
* @return: {top, left}
*/
Dom.getDocumentOffset = function() {
var elementScrollLeft;
var elementScrollTop;
if (Window.document.compatMode == "BackCompat"){
elementScrollLeft=Window.document.body.scrollLeft;
elementScrollTop=Window.document.body.scrollTop;
} else { // CSS1Compat
elementScrollLeft = (document.documentElement.scrollLeft == 0) ? document.body.scrollLeft : document.documentElement.scrollLeft;
elementScrollTop = (document.documentElement.scrollTop == 0) ? document.body.scrollTop : document.documentElement.scrollTop;
}
return {
top: elementScrollTop,
left: elementScrollLeft
};
}
/**
* @desc: 获取指定元素相对于视口的的offset
* @return:
*/
Dom.getElementOffset = function(e) {
if (!e) {
return {};
}
var ee = CreateDom(e);
ee = ee[0];
if (ee) {
if (typeof ee.getBoundingClientRect === 'function') {
var rect = ee.getBoundingClientRect();
return {
left: rect.left,
top: rect.top
};
}
else {
var actualLeft = ee.offsetLeft;
var actualTop = ee.offsetTop;
var current = ee.offsetParent;
while (current){
actualLeft += current.offsetLeft;
actualTop += current.offsetTop;
current = current.offsetParent;
}
var elementScrollLeft;
var elementScrollTop;
if (Window.document.compatMode == "BackCompat"){
elementScrollLeft=Window.document.body.scrollLeft;
elementScrollTop=Window.document.body.scrollTop;
} else {
elementScrollLeft = (Window.document.documentElement.scrollLeft == 0) ? Window.document.body.scrollLeft : Window.document.documentElement.scrollLeft;
elementScrollTop = (Window.document.documentElement.scrollTop == 0) ? Window.document.body.scrollTop : Window.document.documentElement.scrollTop;
}
return {
left: actualLeft-elementScrollLeft,
top: actualTop-elementScrollTop
};
} // if..else.
}
return {};
}
/**
* @desc: 判断是否是dom对象.
* @return: boolean.
*/
Dom.isDom = function(e) {
return (typeof HTMLElement === 'object') ? (e instanceof HTMLElement) : (e && typeof e === 'object' && e.nodeType === 1 && typeof e.nodeName === 'string');
}
/**
* @desc: 统一处理 removeEventListener, detachEvent; 并提供useCapture参数问题.
*/
Dom.removeEventListener = function(dom, eventName, foo, useCapture) {
if (!dom) return;
if (dom.addEventListener) {
dom.removeEventListener(eventName, foo, useCapture);
}
else {
dom.detachEvent('on'+eventName, foo);
}
}
/**
* @desc: 统一处理 addEventListener, attachEvent; 并提供useCapture参数问题.
*/
Dom.addEventListener = function(dom, eventName, foo, useCapture) {
if (!dom) return;
if (dom.addEventListener) {
dom.addEventListener(eventName, foo, useCapture);
}
else {
dom.attachEvent('on'+eventName, foo);
}
}
exports.Dom = Dom;
exports.CreateDom = CreateDom;