解決IE下select標簽innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
更新時間:2010年05月13日 17:45:37 作者:
在ie下面使用innerHTML來插入option選項的話,ie會去掉前面的<option>,并拆分成多個節(jié)點,這樣會造成select的出錯
前言:
這是一個老bug了,現(xiàn)在提供一個完美解決方案。由于我一直是用createElement來創(chuàng)建動態(tài)的option并添加,所以一直沒有遇到這個問題,但是每個人寫代碼風格不同,有的人就喜歡寫字符串形式的標簽并用innerHTML插入,這不就有問題了,為了方便不同編碼風格的人,我封裝了一個方法,用于解決ie的這個bug和兼容5大瀏覽器,這樣大家都可以用一個方法來實現(xiàn)不同的風格,便于維護管理。
bug描述:
在ie下面使用innerHTML來插入option選項的話,ie會去掉前面的<option>,并拆分成多個節(jié)點,這樣會造成select的出錯,不是沒有插進去,而是節(jié)點在轉(zhuǎn)換時出問題了,微軟對這個bug也有描述,并提供了兩個解決方案,大家可以自己搜索一下,我大概提下微軟的兩個方案。
1,使用createElement,這個是正規(guī)渠道,要出錯還真有問題了。
2,插入完整的select字符串,到div中。
實現(xiàn):
原理:
既然是使用innerHTML的人,肯定是想用字符串來插入option了,這里主要就是解決這人人群,當然你也可以傳入createElement對象來插入。
對于傳入的參數(shù)會做個判斷,看是elementObj還是字符串,如果是elementObj那么就使用標準的add方法加入,并做兼容處理。如果是字符串則使用div包裝完整的select并轉(zhuǎn)換成dom對象用appendChild來加入。
注意:
b$.type.isElement(arg)是bBank里面用來判斷對象是否是element元素的方法
b$.browser.isIE()是bBank里面用來判斷是否是ie的方法
b$.parseDom(str)是bBank里面用來轉(zhuǎn)換字符串為標準dom的方法,在我前面的博客中有專門講解
bBank 框架介紹:http://www.cnblogs.com/bruceli/archive/2010/04/15/bBank.html
var sltObj=document.getElementById('xx');//獲取select對象,這里只是給個例子,可以按自己習慣來獲取
function addOption(obj, arg) {
if (b$.type.isElement(arg)) {
if (b$.browser.isIE()) obj.add(arg);
else obj.add(arg, null);
return;
}
var str = '<select>' + arg + '</select>';
var slt = b$.parseDom(str)[0];
for (var i = 0, num = slt.length; i < num; i++) {
obj.appendChild(slt[0]);
}
};
使用:
addOption(sltObj, '<option>a</option>');
END
到這里就結(jié)束了,在這里向大家推薦一個我自己寫的js框架,上面的這個方法集成在框架里面了
使用:b$('obj').addOption(arg);
這是一個老bug了,現(xiàn)在提供一個完美解決方案。由于我一直是用createElement來創(chuàng)建動態(tài)的option并添加,所以一直沒有遇到這個問題,但是每個人寫代碼風格不同,有的人就喜歡寫字符串形式的標簽并用innerHTML插入,這不就有問題了,為了方便不同編碼風格的人,我封裝了一個方法,用于解決ie的這個bug和兼容5大瀏覽器,這樣大家都可以用一個方法來實現(xiàn)不同的風格,便于維護管理。
bug描述:
在ie下面使用innerHTML來插入option選項的話,ie會去掉前面的<option>,并拆分成多個節(jié)點,這樣會造成select的出錯,不是沒有插進去,而是節(jié)點在轉(zhuǎn)換時出問題了,微軟對這個bug也有描述,并提供了兩個解決方案,大家可以自己搜索一下,我大概提下微軟的兩個方案。
1,使用createElement,這個是正規(guī)渠道,要出錯還真有問題了。
2,插入完整的select字符串,到div中。
實現(xiàn):
原理:
既然是使用innerHTML的人,肯定是想用字符串來插入option了,這里主要就是解決這人人群,當然你也可以傳入createElement對象來插入。
對于傳入的參數(shù)會做個判斷,看是elementObj還是字符串,如果是elementObj那么就使用標準的add方法加入,并做兼容處理。如果是字符串則使用div包裝完整的select并轉(zhuǎn)換成dom對象用appendChild來加入。
注意:
b$.type.isElement(arg)是bBank里面用來判斷對象是否是element元素的方法
b$.browser.isIE()是bBank里面用來判斷是否是ie的方法
b$.parseDom(str)是bBank里面用來轉(zhuǎn)換字符串為標準dom的方法,在我前面的博客中有專門講解
bBank 框架介紹:http://www.cnblogs.com/bruceli/archive/2010/04/15/bBank.html
復(fù)制代碼 代碼如下:
var sltObj=document.getElementById('xx');//獲取select對象,這里只是給個例子,可以按自己習慣來獲取
function addOption(obj, arg) {
if (b$.type.isElement(arg)) {
if (b$.browser.isIE()) obj.add(arg);
else obj.add(arg, null);
return;
}
var str = '<select>' + arg + '</select>';
var slt = b$.parseDom(str)[0];
for (var i = 0, num = slt.length; i < num; i++) {
obj.appendChild(slt[0]);
}
};
使用:
復(fù)制代碼 代碼如下:
addOption(sltObj, '<option>a</option>');
END
到這里就結(jié)束了,在這里向大家推薦一個我自己寫的js框架,上面的這個方法集成在框架里面了
使用:b$('obj').addOption(arg);
您可能感興趣的文章:
- input+select(multiple) 實現(xiàn)下拉框輸入值
- 在Spring中用select last_insert_id()時遇到問題
- Mysql select in 按id排序?qū)崿F(xiàn)方法
- 解析MySQL中INSERT INTO SELECT的使用
- insert into select和select into的使用和區(qū)別介紹
- linux使用select實現(xiàn)精確定時器詳解
- 解決Hibernate JPA中insert插入數(shù)據(jù)后自動執(zhí)行select last_insert_id()
- 數(shù)據(jù)庫插入數(shù)據(jù)之select into from與insert into select區(qū)別詳解
- PostgreSQL教程(六):函數(shù)和操作符詳解(2)
- PostgreSQL教程(七):函數(shù)和操作符詳解(3)
- PostgreSQL教程(十六):系統(tǒng)視圖詳解
- 探討select in 在postgresql的效率問題
相關(guān)文章
JS解決?Array.fill()參數(shù)為對象指向同一個引用地址的問題
這篇文章主要介紹了JS解決?Array.fill()參數(shù)為對象指向同一個引用地址問題,解決方案使用map返回出不同的引用的地址,fill參數(shù)可隨意填寫(不為空),主要是map函數(shù)中返回的數(shù)據(jù),需要的朋友可以參考下2023-02-02JavaScript函數(shù)內(nèi)部屬性和函數(shù)方法實例詳解
函數(shù)是由事件驅(qū)動的或者當它被調(diào)用時執(zhí)行的可重復(fù)使用的代碼塊。通過本文給大家介紹JavaScript函數(shù)內(nèi)部屬性和函數(shù)方法,感興趣的朋友一起學習吧2016-03-03基于JavaScript Array數(shù)組方法(新手必看篇)
下面小編就為大家?guī)硪黄贘avaScript Array數(shù)組方法(新手必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08javascript動態(tài)加載實現(xiàn)方法一
這兩天,沒什么太多的事情,好吧,我承認,是我這兩天不想做公司的項目,因為我突發(fā)奇想,其實也不算突發(fā)奇想,算是對以前的想法的實現(xiàn),就是把JS當做Java來寫2012-08-08countup.js實現(xiàn)數(shù)字動態(tài)疊加效果
這篇文章主要為大家詳細介紹了countup.js實現(xiàn)數(shù)字動態(tài)疊加效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10原生JavaScript實現(xiàn)remove()和recover()功能示例
這篇文章主要介紹了原生JavaScript實現(xiàn)remove()和recover()功能,結(jié)合實例形式分析了javascript實現(xiàn)類似jQueryremove()和recover()功能的自定義函數(shù),需要的朋友可以參考下2018-07-07