1. 程式人生 > >關於在IE下對Select標籤設定innerHTML無效的問題

關於在IE下對Select標籤設定innerHTML無效的問題

今天在做應用的時候有個級聯選單的功能,因為一般做開發的時候都是使用FireFox居多(原因不用多說,相信所有的前端開發人員都曾經嚐到了噁心的IE不遵守W3C標準的痛苦),因此想當然的時候對一個Select標籤進行了如下操作:
  1. selectObj.innerHTML = '<option value="value">something</option>'
寫完之後興沖沖在FireFox下測試了一下功能,沒問題,覺得OK!

    第二天有個同事在測試的時候發現在IE下選什麼都沒有用,出不來子選單,告訴我之後,著實把我鬱悶了一番。在IE6下看了一把,貌似也沒有報什麼指令碼錯誤,但就是innerHtML沒有設定成功,因為之前沒有遇到過這個問題,調了很久都沒有找到原因。後來有IE Develop Toolbar看了一下生成之後的HTML結構,發現IE根本沒有按照我規定的格式去渲染select標籤,趕緊在Google上搜了一把,發現這是IE的一個BUG,微軟的
BUG申明
中註明了兩種解決方案:

1. 如果您必須使用 innerHTML ,一種替代方法是使用一個 div 物件封裝 SELECT 元素和然後設定 div 物件的 innerHTML 屬性。 例如:
  1. <html>
  2. <head>
  3. <title>My Example</title>
  4. <script language="Javascript">
  5.     var origDivHTML;
  6.     function init() {
  7.         origDivHTML = myDiv.innerHTML;
  8.     }
  9.     function
     setValues() {
  10. var oldinnerHTML = "your original innerHTML: " + yourDiv.innerHTML;  
  11.         alert(oldinnerHTML);
  12.         yourDiv.innerHTML = origDivHTML;
  13. var curinnerHTML = "your current innerHTML: " + yourDiv.innerHTML; 
  14.         alert(curinnerHTML); 
  15.     }
  16. </script>
  17. </head>
  18. <body onload=
    "init()">
  19.      <div id="myDiv">
  20.          <select name="firstSelect" size="1">
  21.              <option>11111</option>
  22.              <option>22222</option>
  23.              <option>33333</option>
  24.          </select>
  25.      </div>
  26.      <div id="yourDiv">
  27.          <select name="secondSelect" size="1">
  28.              <option>aaaa</option>
  29.              <option>bbbb</option>
  30.              <option>cccc</option>
  31.          </select>
  32.      </div>
  33.      <button onclick="setValues();">click me to set the values</button>
  34. </body>
  35. </html>

2. 理想情況下,應使用 選項(Option) 集合新增為 SELECT 元素的選項。 下面的程式碼顯示用程式設計方式將選項新增到 SELECT 元素的三種方法。例如:
  1. <html>
  2. <head>
  3. <title></title>
  4. </head>
  5. <body>
  6. <script>
  7. function fill_select1() {
  8. for(var i=0; i < 100; i++) {
  9.         select1.options[i] = new Option(i,i);
  10.     }
  11. }
  12. function fill_select2() {
  13. var sOpts = "<select>";
  14. for (var i = 0; i < 100; i++) {
  15.         sOpts += '<option value="' + i + '">' + i + '</option>';
  16.     }
  17.     select2.outerHTML = sOpts  + "</option>";
  18. }
  19. function fill_select3() {
  20. for(var i=0; i < 100; i++) {
  21. var oOption = document.createElement("OPTION");
  22.        oOption.text="Option:  " + i;
  23.        oOption.value=i;
  24.        document.all.select3.add(oOption)
  25.     }
  26. }
  27. </script>
  28. <h2>SELECT Box Population</h2>
  29. <select id=select1 name=select1></select>
  30. <input type="button" value="Populate with options list" id="button1" name="button1"onclick="fill_select1();"><br/><br/>
  31. <select id="select2" name="select2"></select> 
  32. <INPUT type="button" value="Populate with outerHTML" id="button2" name="button2"onclick="fill_select2();"><br/><br/>
  33. <select id="select3" name="select3"></select>
  34. <input type="button" value="Populate with using createElement" id="button3"name="button3" onclick="fill_select3();">
  35. </body>
  36. </html>

    雖然這個BUG在GOOGLE上已經有不少人發表了看法,我還是覺得應該自己去寫下來,總結加深印象,希望能給有需要的朋友提供幫助,少走一些彎路。