<select id="jkit"> <option value="1">jquery</option> </select> | //执行代码: $id('jkit').innerHTML = '<option>jquery</option>'; //IE下并没有报任何错误,但select一个option节点都没有了。如果你对table使用innerHTML,IE会报unknown runtime error |
<div id="jkit"> <select> <option value="1">jquery</option> </select> </div> | //执行代码: $id('jkit').innerHTML = '<select><option value="1">jkit</option></select>'; //这样IE也成功改变select,但这种做法有个缺点,如果你对select注册过事件,这些事件会全部丢失,你要外加代码来重新注册事件。 |
<select> <option value="1">jquery</option> <option value="2">jkit</option> <option value="3">mars</option> </select> | //现在我想在jkit之前多加一个option,用原生的DOM方法实现: var newNode = document.createElement('option'),//新建一个节点 selector = document.getElementById('jkit3'), /* 也可以用selector.options,但getElementsByTagName更通用。 那用childNodes怎么?最好也不要,对于空白节点,IE和FF的处理方式不一样, 就这例子,在FF中,select的firstChild是空白文本节点, 因为select和第一个option之间有换行以及空白字符, FF会为其创建节点,而IE会忽略 */ options = document.getElementsByTagName('option'); newNode.setAttribute('value','new'); //newNode.setAttribute('text','NewNode');text不支持这样设置 //newNode.text = 'NewNode';ie不支持这种方式 newNode.innerHTML = 'NewNode'; selector.insertBefore(newNode,options[1]);//在kit之前插入 |
<table> <tr> <td> <ul> <li></li> <li></li> </ul> </td> <td> <ul> <li></li> </ul> </td> </tr> </table> | //现在我想在第一个li之前多加一个option,用原生的DOM方法实现: newNode = document.createElement('li'), table = document.getElementById('jkit4'), //取li的父节点: uls = table.getElementsByTagName('ul'), /* getElementsByTagName虽然通用,但如果li标签里面嵌套了li,li父节点的兄弟节点也有li的话,那么getElementsByTagName都会取到这些节点,如果你的html结构真有哪么复杂,取出来结果后你也很难定位到你想找的li节点。遇到这情况,你只以通过childNodes一层层往下找,但之前提过childNodes在IE和FF中行为是不致的,所以你还要做兼容处理。*/ lis = table.getElementsByTagName('li'); newNode.innerHTML = 'NewNode'; //在指定位置插入 uls[0].insertBefore(newNode,lis[0]); |
<table id="jkit"> <tbody> <tr> <th class="align">Option</th> <th> <a href="javascript:void(0);">Status</a> </th> <th> <a href="javascript:void(0);">Attribute</a> </th> </tr> <tr> <td></td> <td> <select size="3" name="status"> <option value="all">所有</option> <option value="0">下架</option> </select> </td> <td> <ul> <li id="lior">L</li> <li>XL</li> </ul> </td> </tr> <tr> <td></td> <td></td> <td></td> </tr> </tbody> </table> | /* 下面代码实例化了一个无限层次节点操作插件的对象,相当于重新构造了一棵新的对象树,新的对象树带有新的成员方法。就下面的例子,新对象树引用为table,table也是新树的根。它的后代对象由第二个参数childs决定 。新树的根引用是操作其后代对象的入口。重点讲解一下第二个参数。childs是一个数组结构,数组的第一个元素为tr,表示为dom根节点root的孩子节点tr重新构造新对象。如果原dom根节点root的中没有tr,将不会构造对象;如果tr内嵌有tr,不会为内嵌的tr构造节点,也就是说只会为孩子节点构造对象,孩子以下不会理会。第二个元素是td th,为什么有两个呢?因为tr下的孩子节点可以是th也可以是td,如果想同时为th td构造新的对象,就要同时写进去,用空格分开,检签的顺序不限制。第三个元素为select ul,为什么这两个可以写在一起?因为他们位于同一层次的,相对于根节点,它们都在第三层。只要同一层次的都可以写在一起。后面的以此类推,数量不限,就是无限层次了。新对象树的层次结构和原dom树的层次结构是一一对应的。 */ root = document.getElementById('category'), childs = ['tr', 'td th', 'select ul', 'li option'], table = $CL.newObj('maNode', [root, childs]); |
新闻热点
疑难解答