该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-09
最后修改:2011-01-16
innerHTML 这个由 IE
引入的属性成了事实标准,各浏览器均支持。尽管html4中没有承认它,但html5已经正式将其纳入
。 var dh = Ext.DomHelper; // 使用dh别名
createHtml 的定义如下 function createHtml(o){ var b = '', attr, val, key, keyVal, cn; if(Ext.isString(o)){ b = o; } else if (Ext.isArray(o)) { for (var i=0; i < o.length; i++) { if(o[i]) { b += createHtml(o[i]); } }; } else { b += '<' + (o.tag = o.tag || 'div'); Ext.iterate(o, function(attr, val){ if(!/tag|children|cn|html$/i.test(attr)){ if (Ext.isObject(val)) { b += ' ' + attr + '="'; Ext.iterate(val, function(key, keyVal){ b += key + ':' + keyVal + ';'; }); b += '"'; }else{ b += ' ' + ({cls : 'class', htmlFor : 'for'}[attr] || attr) + '="' + val + '"'; } } }); // Now either just close the tag or try to add children and close the tag. if (emptyTags.test(o.tag)) { b += '/>'; } else { b += '>'; if ((cn = o.children || o.cn)) { b += createHtml(cn); } else if(o.html){ b += o.html; } b += '</' + o.tag + '>'; } } return b; }
虽然代码较多,但接口却很简单:传入了一个参数o,返回了一个字符串b。 var str = createHtml('<div>test</div>'); alert(str); // "<div>test</div>" 分支二的情况 var str = createHtml(['<div>test</div>','<p>pp</p>']); alert(str); // "<div>test</div><p>pp</p>"
分支三的情况 var obj = { tag:'ul', children:[{tag:'li',html:'li 1'},{tag:'li',html:'li 2'}] }; var str = createHtml(obj); alert(str); // "<ul><li>li 1</li><li>li 2</li></ul>"
分支三的详细情况如下 b += '<' + (o.tag = o.tag || 'div');
b为空字符串,该语句执行完为:"<tag",如果没有所传对象没有tag属性,默认创建div即"<div" Ext.iterate(o, function(attr, val){ if(!/tag|children|cn|html$/i.test(attr)){ if (Ext.isObject(val)) { b += ' ' + attr + '="'; Ext.iterate(val, function(key, keyVal){ b += key + ':' + keyVal + ';'; }); b += '"'; }else{ b += ' ' + ({cls : 'class', htmlFor : 'for'}[attr] || attr) + '="' + val + '"'; } } });
Ext.iterate方法是一个通用迭代器,可以迭代数组,也可以是对象。在 读Ext之二(实用方法) 提到。即所传对象o的属性不为tag、children、cn、html时给该元素添加html属性 var obj = { tag: 'input', name: 'uname', cls: 'myClass', id: 'myId' }; var str = createHtml(obj); // 创建input元素,添加name、class及id属性 alert(str); // <input name="uname" class="myClass" id="myId"/>
var obj = { tag: 'p', style: {width:'100px',height:'100px',background:'red'} }; var str = createHtml(obj); alert(str); // <p style="width:100px;height:100px;background:red;"></p> if (emptyTags.test(o.tag)) { b += '/>'; }
emptyTags 是一个正则,这句是对非闭合标签的处理,非闭合标签如br、input、img等。 else { b += '>'; if ((cn = o.children || o.cn)) { b += createHtml(cn); } else if(o.html){ b += o.html; } b += '</' + o.tag + '>'; }
接下来如果有children或cn属性,则添加子元素,是一个递归调用,即子元素如果有属性,子元素仍然会继续递归添加。
这就是这个createHtml函数了。该函数实现的很紧凑,巧妙。 markup : function(o){ return createHtml(o); },
createHTML方法就是私有的createHTML createHtml : createHtml
个人认为这个方法和markup方法重复了。 function doInsert(el, o, returnElement, pos, sibling, append){ var newNode = pub.insertHtml(pos, Ext.getDom(el), createHtml(o)); return returnElement ? Ext.get(newNode, true) : newNode; }
好了,下一篇 会接着看DomHelper的其它方法。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-15
冒昧的请帮我个忙,我的hoouf.com登录页面在IE9上文本框后面的提示信息出不来,不知是什么问题?该如何书写代码,目前主要代码如下
var dom_loginPassword = Ext.getDom('loginPassword'); var dom_loginPassword_parentNode = Ext.get(dom_loginPassword.parentNode); dom_loginPassword_parentNode.createChild({ tag:'span', html: " <a href='#' onclick='forget_password()'>取回密码</a>" }); 详细代码请到我的网站查看,再次先行谢过! |
|
返回顶楼 | |
发表时间:2011-01-15
最后修改:2011-01-15
IE9后下输入框后面的文字的确显示不了。但F12开始调试工具->启动调试后按F5一直执行完。后面的文字可以显示。应该是IE9的Bug。它跳到DomHelper中的insertHtml的else语句块中。
在head中添加以下语句暂时解决以下 <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> |
|
返回顶楼 | |
发表时间:2011-01-18
谢谢,我晚上回去试一下,但是这个写法毕竟不是最好的办法。如果真是IE bug,我只能盼望微软能修复,昨天实在没辙了,只能把IE9卸载掉了,不然连我自己都不能用了,还怎么给别人用。
|
|
返回顶楼 | |
浏览 3828 次