document.createElement创建的<button>的type属性为只读
document.createElement创建的<button>,即使不追加到DOM树中,在IE中也不能修改其type属性和button属性,其他浏览器设置也可能不生效。
测试代码
测试代码中避开了type的默认值,因为<button>的type属性在IE下的默认值是button,而在其他浏览器默认是submit 。我们平时在使用时,建议显式的声明type属性。
Always specify the type attribute for the button. The default type for Internet Explorer is “button”, while in other browsers (and in the W3C specification) it is “submit”.
// 创建input var iptEl = document.createElement('input'); iptEl.type = 'password'; // 避免默认值 iptEl.name = 'damon'; document.body.appendChild(iptEl); // 创建button var btnEl = document.createElement('button'); btnEl.type = 'reset'; // IE下这里报错了 btnEl.name = 'damon'; document.body.appendChild(btnEl); alert(document.getElementsByTagName('input')[0].type +','+ document.getElementsByTagName('button')[0].type);
测试结果
浏览器 | <input> | <button> |
---|---|---|
IE 6 | Yes | No |
IE 7 | Yes | No |
IE 8 | Yes | No |
IE 9 | Yes | Yes |
Firefox 4.0 | Yes | Yes |
Chrome 13(DEV) | Yes | No |
Safari 5 | Yes | No |
Opera 11 | Yes | Yes |
从测试结果可以看到,<input>并无此问题。
解决方案
As of Microsoft Internet Explorer 5, the type property is read/write-once, but only when an input element is created with the createElement method and before it is added to the document.
即只有document.createElement创建的input元素,在其增加到DOM树之前允许对type属性进行一次更改。但从实际情况来看并非如此,这个仅有的一次设置type的机会在创建时就用掉了。从上面的测试结果看,这个问题直到IE9才修复。
针对IE,document.createElement(tag)中,tag可以是带有属性的字符串,创建时即将type和name写上即可。
Attributes can be included with the sTag as long as the entire string is valid HTML.
对其他的现代浏览器(Chrome、Safari等)使用setAttribute即可,或者使用document.createAttribute创建属性节点,再通过setAttributeNode加到元素节点上。
方法一:
var btnEl; try { btnEl = document.createElement(''); } catch(e){} if(! btnEl) { btnEl = document.createElement('button'); btnEl.setAttribute('type', 'reset'); btnEl.setAttribute('name', 'damon'); } document.body.appendChild(btnEl); alert(document.getElementsByTagName('button')[0].type +','+ document.getElementsByTagName('button')[0].name);
方法二:
var btnEl; try { btnEl = document.createElement(''); } catch(e){} if(! btnEl) { btnEl = document.createElement('button'); var aType = document.createAttribute('type'); var aName = document.createAttribute('name'); aType.value = 'reset'; aName.value = 'damon'; btnEl.setAttributeNode(aType); btnEl.setAttributeNode(aName); } document.body.appendChild(btnEl); alert(document.getElementsByTagName('button')[0].type +','+ document.getElementsByTagName('button')[0].name);