| <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]); |
新聞熱點
疑難解答