2010-6-29 update
判断是IE6、7浏览器的方法还可以通过检测:document.documentElement.hasAttribute这个方法是否存在来判断。IE6、7下document.documentElement是不支持hasAttribute方法的;IE8、FF、Chrome、Opera等都支持。这样就可以避免丑陋的@cc_on判断方式了,不过在性能上,或许还是会@cc_on比较好。
——————–完美的分界线——————-
昨天想起了之前在口碑的时候就想写的一个代码:把HTML标签名作为方法来连缀性的插入元素,比如下面的操作方式:
var root=Node("div","",{"id":"test","class":"div","onclick":"alert(this.innerHTML);",
"style":"background-color:#f00;"})
.h1("P Element in DIV Element",{"class":"p"})
.em("EM Element",{"class":"em"}).appendTo(document.body);
//==========================================
Node("div","",{"class":"div","onclick":"alert(this.innerHTML);"})
.h1("P Element in DIV Element",{"class":"p"})
.em("EM Element",{"class":"em"}).appendTo(root);
如上代码所示,将HTML的标签名作为方法,在Node方法执行的时候就动态生成一个DOM元素,之后调用的HTML标签名形式的方法会一步一步的appendChild到前面的一个DOM元素中,调用每一个HTML标签名形式的方法都会动态生成一个相应的DOM元素,最后调用appendTo或者beforeTo方法将Node方法动态生成的DOM元素插入到这两个方法参数指定的父元素中。同时,还可以设置DOM元素的attribute、style、text。是不是有点意思呢?^_^
但是在写这个代码的时候,遇到的最大困难,就是setAttribute了,一来IE6、7对一些属性使用了不同的DOM属性名,在设置style的时候,也存在cssText和直接setAttribute style的差别,这些都是比较纠结的。幸好,下面的几个知识点可以解决大部分的冲突:
- 利用IE下setAttribute方法的第三个参数,可以解决IE6、7下对于一些属性大小写的差别。《setAttribute Method》、《setAttribute()方法参数问题》
- 对于一些IE6、7跟其他浏览器的属性名完全不同(比如:class、for、checked、selected),这可以通过一个字面量对象来纠正,可以看下面我写的源码的解决办法。
- IE6、7无法给onxxx属性(事件)直接赋值为字符串,需要赋给它函数才行。这个就需要做判断了,本人使用了@cc_on来判断IE的版本,并通过new Function的方式给IE6、7设置onxxx这样的属性。
- 同时,还有一个小陷阱,在HTML标签中直接声明onxxx属性的时候,不能够使用匿名函数的方式,比如:onclick=”function(){alert(‘hello’);}”,这将会造成语法错误。
(全文…)