關於在IE下對Select標籤設定innerHTML無效的問題
阿新 • • 發佈:2019-02-19
今天在做應用的時候有個級聯選單的功能,因為一般做開發的時候都是使用FireFox居多(原因不用多說,相信所有的前端開發人員都曾經嚐到了噁心的IE不遵守W3C標準的痛苦),因此想當然的時候對一個Select標籤進行了如下操作:
第二天有個同事在測試的時候發現在IE下選什麼都沒有用,出不來子選單,告訴我之後,著實把我鬱悶了一番。在IE6下看了一把,貌似也沒有報什麼指令碼錯誤,但就是innerHtML沒有設定成功,因為之前沒有遇到過這個問題,調了很久都沒有找到原因。後來有IE Develop Toolbar看了一下生成之後的HTML結構,發現IE根本沒有按照我規定的格式去渲染select標籤,趕緊在Google上搜了一把,發現這是IE的一個BUG,微軟的 BUG申明中註明了兩種解決方案:
1. 如果您必須使用 innerHTML ,一種替代方法是使用一個 div 物件封裝 SELECT 元素和然後設定 div 物件的 innerHTML 屬性。 例如:
2. 理想情況下,應使用 選項(Option) 集合新增為 SELECT 元素的選項。 下面的程式碼顯示用程式設計方式將選項新增到 SELECT 元素的三種方法。例如:
雖然這個BUG在GOOGLE上已經有不少人發表了看法,我還是覺得應該自己去寫下來,總結加深印象,希望能給有需要的朋友提供幫助,少走一些彎路。
- selectObj.innerHTML = '<option value="value">something</option>'
第二天有個同事在測試的時候發現在IE下選什麼都沒有用,出不來子選單,告訴我之後,著實把我鬱悶了一番。在IE6下看了一把,貌似也沒有報什麼指令碼錯誤,但就是innerHtML沒有設定成功,因為之前沒有遇到過這個問題,調了很久都沒有找到原因。後來有IE Develop Toolbar看了一下生成之後的HTML結構,發現IE根本沒有按照我規定的格式去渲染select標籤,趕緊在Google上搜了一把,發現這是IE的一個BUG,微軟的
1. 如果您必須使用 innerHTML ,一種替代方法是使用一個 div 物件封裝 SELECT 元素和然後設定 div 物件的 innerHTML 屬性。 例如:
- <html>
- <head>
- <title>My Example</title>
- <script language="Javascript">
- var origDivHTML;
- function init() {
- origDivHTML = myDiv.innerHTML;
- }
-
function
- var oldinnerHTML = "your original innerHTML: " + yourDiv.innerHTML;
- alert(oldinnerHTML);
- yourDiv.innerHTML = origDivHTML;
- var curinnerHTML = "your current innerHTML: " + yourDiv.innerHTML;
- alert(curinnerHTML);
- }
- </script>
- </head>
-
<body onload=
- <div id="myDiv">
- <select name="firstSelect" size="1">
- <option>11111</option>
- <option>22222</option>
- <option>33333</option>
- </select>
- </div>
- <div id="yourDiv">
- <select name="secondSelect" size="1">
- <option>aaaa</option>
- <option>bbbb</option>
- <option>cccc</option>
- </select>
- </div>
- <button onclick="setValues();">click me to set the values</button>
- </body>
- </html>
2. 理想情況下,應使用 選項(Option) 集合新增為 SELECT 元素的選項。 下面的程式碼顯示用程式設計方式將選項新增到 SELECT 元素的三種方法。例如:
- <html>
- <head>
- <title></title>
- </head>
- <body>
- <script>
- function fill_select1() {
- for(var i=0; i < 100; i++) {
- select1.options[i] = new Option(i,i);
- }
- }
- function fill_select2() {
- var sOpts = "<select>";
- for (var i = 0; i < 100; i++) {
- sOpts += '<option value="' + i + '">' + i + '</option>';
- }
- select2.outerHTML = sOpts + "</option>";
- }
- function fill_select3() {
- for(var i=0; i < 100; i++) {
- var oOption = document.createElement("OPTION");
- oOption.text="Option: " + i;
- oOption.value=i;
- document.all.select3.add(oOption)
- }
- }
- </script>
- <h2>SELECT Box Population</h2>
- <select id=select1 name=select1></select>
- <input type="button" value="Populate with options list" id="button1" name="button1"onclick="fill_select1();"><br/><br/>
- <select id="select2" name="select2"></select>
- <INPUT type="button" value="Populate with outerHTML" id="button2" name="button2"onclick="fill_select2();"><br/><br/>
- <select id="select3" name="select3"></select>
- <input type="button" value="Populate with using createElement" id="button3"name="button3" onclick="fill_select3();">
- </body>
- </html>
雖然這個BUG在GOOGLE上已經有不少人發表了看法,我還是覺得應該自己去寫下來,總結加深印象,希望能給有需要的朋友提供幫助,少走一些彎路。