1 /** 2 Not instanciable. 3 * @constructor 4 */ 5 var YDom = { 6 /** 7 * get dom element from target data. 8 * @param {string/domElement} target dom object or id. 9 * @return {domElement/null} domElement if target is window, document , a dom object or its id , else null. 10 */ 11 get:function(target){ 12 var nod = typeof(target)=="string" ? document.getElementById(target):target; 13 return nod&&(nod.tagName||nod==document||nod==window) ? nod : null; 14 }, 15 /** 16 * create dom element.<br/> 17 * ex:<br/><code>YDom.create('label',{style:{border:'solid 1px #088'}},["ok?",YDom.create('input',{type:'checkbox'})]);</code> 18 * @param {string} name dom tag name. 19 * @param {object} [datas] the dom element parameters object. ex {width:100,style:{width:"100px"}} 20 * @param {array} [childs] the dom element childs. child units can be domElement or string. 21 * @return {domElement} the created new domElement 22 */ 23 create :function create(name,datas,childs){ 24 try{ 25 var dn = document.createElement(name.toUpperCase()); 26 27 var dataAssign=function(tgt,src,indx){ 28 for(var i in src) 29 if(src[i].join || typeof(src[i])=="object") dataAssign(tgt[i],src[i]); 30 else tgt[i] = src[i]; 31 } 32 dataAssign(dn,datas); 33 if(childs && childs.join){ 34 for(var i in childs){ 35 if(typeof(childs[i])=="string")dn.appendChild(document.createTextNode(childs[i])); 36 else dn.appendChild(childs[i]); 37 } 38 } 39 }catch(e){ 40 var stacktrace = YFunction.stackTrace(0); 41 throw(["","YDom.create Error:","",e,"","call stack : [ "+stacktrace.join('\n> ')+" ]"].join('\n')); 42 // throw(e); 43 } 44 return dn; 45 }, 46 /** 47 * get dom element position from nearest parent with style.position='absolute'.<br/> 48 * @param {domElement/mixed} source domElement. 49 * @return {array} dom element absolute offset possition. 50 */ 51 absoluteOffset:function(node){ 52 var tmpobj=YDom.get(node); 53 var cnt = 0; 54 while(cnt==0||(tmpobj&&tmpobj.style!='absolute'&&tmpobj.tagName.toLowerCase()!='body')){ 55 tmpobj = tmpobj.offsetParent; 56 cnt++; 57 } 58 return YDom.offset(node,cnt); 59 }, 60 /** 61 * get dom element position.<br/> 62 * get position in window if limit==0 or not set. 63 * @param {domElement/mixed} source domElement. 64 * @param {int} limit element offset recursions. Infinite if <=0 . 65 * @return {array} dom element offset possition. 66 */ 67 offset:function(node,limit){ 68 var l = typeof(limit)=="number"&&limit!=0 ? limit : -1; 69 var res = [0,0]; 70 var tmpobj=YDom.get(node); 71 var cnt = 0; 72 while(tmpobj&& cnt!=l){ 73 res[0]+=tmpobj.offsetLeft-tmpobj.scrollLeft; 74 res[1]+=tmpobj.offsetTop;//-tmpobj.scrollTop; 75 tmpobj = tmpobj.offsetParent; 76 cnt++; 77 } 78 return res; 79 }, 80 /** 81 * clone dom element, his datas and childrens.<br/> 82 * @param {domElement/mixed} source domElement. 83 * @return {domElement} the created new domElement 84 */ 85 clone:function(source){ 86 var node = YDom.get(source); if(!node)return null; 87 var attr = YDom.getAttributes(node); 88 if(attr.style)attr.style=YCss.cleanedStyle(node); 89 var sons = [] 90 if(node.childNodes){ 91 for(var i in node.childNodes){ 92 if(node.childNodes[i].nodeType==1){ 93 sons.push(YDom.clone(node.childNodes[i])); 94 }else if(node.childNodes[i].nodeType==3){ 95 sons.push(node.childNodes[i].nodeValue+""); 96 } 97 } 98 }return YDom.create(node.tagName,attr,sons); 99 }, 100 /** get dom element dimensions 101 * @param {string/domElement} target dom object or id. 102 * @return {array} dom element dimensions 103 */ 104 size:function(target){ 105 var node = YDom.get(target); 106 return (node&&typeof(node.offsetWidth)=="number")? [node.offsetWidth,node.offsetHeight] : [0,0]; 107 }, 108 /** get content dimensions 109 * @param {string/domElement} content dom object or id or html code. 110 * @return {array} content dimensions 111 */ 112 contentSize:function(content){ 113 if(!document||!document.body){throw("\nYDom.contentSize Error:\ndocument.body musts exist");} 114 var spans = YDom.create('span',{style:{padding:"0px"}}); 115 var node = YDom.get(content); 116 if(node){ spans.appendChild(node); 117 }else{ spans.innerHTML=""+content;} 118 document.body.appendChild(spans); 119 var size = YDom.size(spans); 120 document.body.removeChild(spans); 121 return size; 122 }, 123 /** convert elements collection to array 124 * @param {collection} collection tags collection. 125 * @return {array} tags list 126 */ 127 collectionToList:function(collection){ 128 var tlist = []; 129 for(var j=0;j<collection.length;j++)tlist.push(collection.item(j)); 130 return tlist; 131 }, 132 /** get all elements having an id from root or in the document 133 * @param {dom} [root] default = document.documentElement 134 * @return {array} tags list indexed by their ids; 135 */ 136 getElementsByIds:function(root){ 137 var result={}; 138 YDom.parse(function(dom,dat){if(dom.id) result[dom.id]=dom;},{},root); 139 return result; 140 }, 141 /** parse all elements from root or in the document 142 * @param {function} Function invoked on every parsed dom element. type:Function(domElement,datas) 143 * @param {mixed} datas used when <b>Function</b> is invoked 144 * @param {dom} [root] default = document.documentElement 145 */ 146 parse:function(Function,datas,root){ 147 root=root?root:document.documentElement; 148 var iter=function(_root){ 149 if(root.tagName){ 150 Function(_root,datas); 151 for(var i=0;i<_root.childNodes.length;i++) iter(_root.childNodes[i]); 152 } 153 }; 154 iter(root); 155 }, 156 /** get elements list by criterias 157 * @param {string/string Array} tagNames tags names. 158 * @param {string/string Array} criterias elements properties filters (ex:{title:'the title',name:'the name'}). 159 * @param {dom} [root] default = document 160 * @return {array} tags list 161 */ 162 geElements:function(tagNames,criterias,root){ 163 root=root?root:document; 164 var tnl = tagNames&&tagNames.join?tagNames:[tagNames]; 165 var ctr = criterias?criterias:{}; 166 167 var tlist = [],list = []; 168 for(var i in tnl){ 169 var tl = root.getElementsByTagName(tnl[i]); 170 for(var j=0;j<tl.length;j++)tlist.push(tl.item(j)); 171 }; 172 for(var i in tlist){ 173 var allok=true; 174 for(var j in criterias) 175 if(tlist[i][j]!=criterias[j]){allok=false;break;} 176 if(allok)list.push(tlist[i]); 177 } 178 return list; 179 }, 180 /** return dom element attributes in a new object 181 * @param {string/domElement} name dom object or id. 182 * @return {object} dom element attributes 183 */ 184 getAttributes:function(target){ 185 var node = YDom.get(target); 186 var obj = {}; 187 if(node)for(var i in node){ if(node.hasAttribute(i))obj[i]=node[i];} 188 return obj; 189 } 190 }; 191 var YDomNew = yDomNew = ydomNew = ydomnew = YdomNew = YDom.create; 192