function _get(val) { return K(val)[0]; } function _getDoc(node) { if (!node) { return document; } return node.ownerDocument || node.document || node; } function _getWin(node) { if (!node) { return window; } var doc = _getDoc(node); return doc.parentWindow || doc.defaultView; } function _setHtml(el, html) { if (el.nodeType != 1) { return; } var doc = _getDoc(el); try { el.innerHTML = '' + html; var temp = doc.getElementById('__kindeditor_temp_tag__'); temp.parentNode.removeChild(temp); } catch(e) { // bugfix: 在IE上innerHTML有时候报错 K(el).empty(); K('@' + html, doc).each(function() { el.appendChild(this); }); } } function _hasClass(el, cls) { return _inString(cls, el.className, ' '); } function _setAttr(el, key, val) { if (_IE && _V < 8 && key.toLowerCase() == 'class') { key = 'className'; } el.setAttribute(key, '' + val); } function _removeAttr(el, key) { if (_IE && _V < 8 && key.toLowerCase() == 'class') { key = 'className'; } _setAttr(el, key, ''); el.removeAttribute(key); } function _getNodeName(node) { if (!node || !node.nodeName) { return ''; } return node.nodeName.toLowerCase(); } function _computedCss(el, key) { var self = this, win = _getWin(el), camelKey = _toCamel(key), val = ''; if (win.getComputedStyle) { var style = win.getComputedStyle(el, null); val = style[camelKey] || style.getPropertyValue(key) || el.style[camelKey]; } else if (el.currentStyle) { val = el.currentStyle[camelKey] || el.style[camelKey]; } return val; } function _hasVal(node) { return !!_VALUE_TAG_MAP[_getNodeName(node)]; } function _docElement(doc) { doc = doc || document; return _QUIRKS ? doc.body : doc.documentElement; } function _docHeight(doc) { var el = _docElement(doc); return Math.max(el.scrollHeight, el.clientHeight); } function _docWidth(doc) { var el = _docElement(doc); return Math.max(el.scrollWidth, el.clientWidth); } function _getScrollPos(doc) { doc = doc || document; var x, y; if (_IE || _NEWIE || _OPERA) { x = _docElement(doc).scrollLeft; y = _docElement(doc).scrollTop; } else { x = _getWin(doc).scrollX; y = _getWin(doc).scrollY; } return {x : x, y : y}; } // create KNode class function KNode(node) { this.init(node); } _extend(KNode, { init : function(node) { var self = this; node = _isArray(node) ? node : [node]; var length = 0; for (var i = 0, len = node.length; i < len; i++) { if (node[i]) { self[i] = node[i].constructor === KNode ? node[i][0] : node[i]; length++; } } self.length = length; self.doc = _getDoc(self[0]); self.name = _getNodeName(self[0]); self.type = self.length > 0 ? self[0].nodeType : null; self.win = _getWin(self[0]); }, each : function(fn) { var self = this; for (var i = 0; i < self.length; i++) { if (fn.call(self[i], i, self[i]) === false) { return self; } } return self; }, bind : function(type, fn) { this.each(function() { _bind(this, type, fn); }); return this; }, unbind : function(type, fn) { this.each(function() { _unbind(this, type, fn); }); return this; }, fire : function(type) { if (this.length < 1) { return this; } _fire(this[0], type); return this; }, hasAttr : function(key) { if (this.length < 1) { return false; } return !!_getAttr(this[0], key); }, attr : function(key, val) { var self = this; if (key === undefined) { return _getAttrList(self.outer()); } if (typeof key === 'object') { _each(key, function(k, v) { self.attr(k, v); }); return self; } if (val === undefined) { val = self.length < 1 ? null : _getAttr(self[0], key); return val === null ? '' : val; } self.each(function() { _setAttr(this, key, val); }); return self; }, removeAttr : function(key) { this.each(function() { _removeAttr(this, key); }); return this; }, get : function(i) { if (this.length < 1) { return null; } return this[i || 0]; }, eq : function(i) { if (this.length < 1) { return null; } return this[i] ? new KNode(this[i]) : null; }, hasClass : function(cls) { if (this.length < 1) { return false; } return _hasClass(this[0], cls); }, addClass : function(cls) { this.each(function() { if (!_hasClass(this, cls)) { this.className = _trim(this.className + ' ' + cls); } }); return this; }, removeClass : function(cls) { this.each(function() { if (_hasClass(this, cls)) { this.className = _trim(this.className.replace(new RegExp('(^|\\s)' + cls + '(\\s|$)'), ' ')); } }); return this; }, html : function(val) { var self = this; if (val === undefined) { if (self.length < 1 || self.type != 1) { return ''; } return _formatHtml(self[0].innerHTML); } self.each(function() { _setHtml(this, val); }); return self; }, text : function() { var self = this; if (self.length < 1) { return ''; } return _IE ? self[0].innerText : self[0].textContent; }, hasVal : function() { if (this.length < 1) { return false; } return _hasVal(this[0]); }, val : function(val) { var self = this; if (val === undefined) { if (self.length < 1) { return ''; } return self.hasVal() ? self[0].value : self.attr('value'); } else { self.each(function() { if (_hasVal(this)) { this.value = val; } else { _setAttr(this, 'value' , val); } }); return self; } }, css : function(key, val) { var self = this; if (key === undefined) { return _getCssList(self.attr('style')); } if (typeof key === 'object') { _each(key, function(k, v) { self.css(k, v); }); return self; } if (val === undefined) { if (self.length < 1) { return ''; } return self[0].style[_toCamel(key)] || _computedCss(self[0], key) || ''; } self.each(function() { this.style[_toCamel(key)] = val; }); return self; }, width : function(val) { var self = this; if (val === undefined) { if (self.length < 1) { return 0; } return self[0].offsetWidth; } return self.css('width', _addUnit(val)); }, height : function(val) { var self = this; if (val === undefined) { if (self.length < 1) { return 0; } return self[0].offsetHeight; } return self.css('height', _addUnit(val)); }, opacity : function(val) { this.each(function() { if (this.style.opacity === undefined) { this.style.filter = val == 1 ? '' : 'alpha(opacity=' + (val * 100) + ')'; } else { this.style.opacity = val == 1 ? '' : val; } }); return this; }, data : function(key, val) { var self = this; key = 'kindeditor_data_' + key; if (val === undefined) { if (self.length < 1) { return null; } return self[0][key]; } this.each(function() { this[key] = val; }); return self; }, pos : function() { var self = this, node = self[0], x = 0, y = 0; if (node) { if (node.getBoundingClientRect) { var box = node.getBoundingClientRect(), pos = _getScrollPos(self.doc); x = box.left + pos.x; y = box.top + pos.y; } else { while (node) { x += node.offsetLeft; y += node.offsetTop; node = node.offsetParent; } } } return {x : _round(x), y : _round(y)}; }, clone : function(bool) { if (this.length < 1) { return new KNode([]); } return new KNode(this[0].cloneNode(bool)); }, append : function(expr) { this.each(function() { if (this.appendChild) { this.appendChild(_get(expr)); } }); return this; }, appendTo : function(expr) { this.each(function() { _get(expr).appendChild(this); }); return this; }, before : function(expr) { this.each(function() { this.parentNode.insertBefore(_get(expr), this); }); return this; }, after : function(expr) { this.each(function() { if (this.nextSibling) { this.parentNode.insertBefore(_get(expr), this.nextSibling); } else { this.parentNode.appendChild(_get(expr)); } }); return this; }, replaceWith : function(expr) { var nodes = []; this.each(function(i, node) { _unbind(node); var newNode = _get(expr); node.parentNode.replaceChild(newNode, node); nodes.push(newNode); }); return K(nodes); }, empty : function() { var self = this; self.each(function(i, node) { var child = node.firstChild; while (child) { if (!node.parentNode) { return; } var next = child.nextSibling; child.parentNode.removeChild(child); child = next; } }); return self; }, remove : function(keepChilds) { var self = this; self.each(function(i, node) { if (!node.parentNode) { return; } _unbind(node); if (keepChilds) { var child = node.firstChild; while (child) { var next = child.nextSibling; node.parentNode.insertBefore(child, node); child = next; } } node.parentNode.removeChild(node); delete self[i]; }); self.length = 0; return self; }, show : function(val) { var self = this; if (val === undefined) { val = self._originDisplay || ''; } if (self.css('display') != 'none') { return self; } return self.css('display', val); }, hide : function() { var self = this; if (self.length < 1) { return self; } self._originDisplay = self[0].style.display; return self.css('display', 'none'); }, outer : function() { var self = this; if (self.length < 1) { return ''; } var div = self.doc.createElement('div'), html; div.appendChild(self[0].cloneNode(true)); html = _formatHtml(div.innerHTML); div = null; return html; }, isSingle : function() { return !!_SINGLE_TAG_MAP[this.name]; }, isInline : function() { return !!_INLINE_TAG_MAP[this.name]; }, isBlock : function() { return !!_BLOCK_TAG_MAP[this.name]; }, isStyle : function() { return !!_STYLE_TAG_MAP[this.name]; }, isControl : function() { return !!_CONTROL_TAG_MAP[this.name]; }, contains : function(otherNode) { if (this.length < 1) { return false; } return _contains(this[0], _get(otherNode)); }, parent : function() { if (this.length < 1) { return null; } var node = this[0].parentNode; return node ? new KNode(node) : null; }, children : function() { if (this.length < 1) { return new KNode([]); } var list = [], child = this[0].firstChild; while (child) { if (child.nodeType != 3 || _trim(child.nodeValue) !== '') { list.push(child); } child = child.nextSibling; } return new KNode(list); }, first : function() { var list = this.children(); return list.length > 0 ? list.eq(0) : null; }, last : function() { var list = this.children(); return list.length > 0 ? list.eq(list.length - 1) : null; }, index : function() { if (this.length < 1) { return -1; } var i = -1, sibling = this[0]; while (sibling) { i++; sibling = sibling.previousSibling; } return i; }, prev : function() { if (this.length < 1) { return null; } var node = this[0].previousSibling; return node ? new KNode(node) : null; }, next : function() { if (this.length < 1) { return null; } var node = this[0].nextSibling; return node ? new KNode(node) : null; }, scan : function(fn, order) { if (this.length < 1) { return; } order = (order === undefined) ? true : order; function walk(node) { var n = order ? node.firstChild : node.lastChild; while (n) { var next = order ? n.nextSibling : n.previousSibling; if (fn(n) === false) { return false; } if (walk(n) === false) { return false; } n = next; } } walk(this[0]); return this; } }); _each(('blur,focus,focusin,focusout,load,resize,scroll,unload,click,dblclick,' + 'mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,' + 'change,select,submit,keydown,keypress,keyup,error,contextmenu').split(','), function(i, type) { KNode.prototype[type] = function(fn) { return fn ? this.bind(type, fn) : this.fire(type); }; }); var _K = K; K = function(expr, root) { if (expr === undefined || expr === null) { return; } function newNode(node) { if (!node[0]) { node = []; } return new KNode(node); } if (typeof expr === 'string') { if (root) { root = _get(root); } var length = expr.length; if (expr.charAt(0) === '@') { expr = expr.substr(1); } // HTML // 包含HTML代码,或者第一个字符为"@"时当做HTML字符串 if (expr.length !== length || /<.+>/.test(expr)) { var doc = root ? root.ownerDocument || root : document, div = doc.createElement('div'), list = []; // HTML前添加IMG,防止IE抛出异常 div.innerHTML = '' + expr; for (var i = 0, len = div.childNodes.length; i < len; i++) { var child = div.childNodes[i]; if (child.id == '__kindeditor_temp_tag__') { continue; } list.push(child); } return newNode(list); } // selector return newNode(_queryAll(expr, root)); } // KNode if (expr && expr.constructor === KNode) { return expr; } // jQuery object if (expr.toArray) { expr = expr.toArray(); } // Native NodeList if (_isArray(expr)) { return newNode(expr); } // Native Node return newNode(_toArray(arguments)); }; _each(_K, function(key, val) { K[key] = val; }); K.NodeClass = KNode; window.KindEditor = K;