select節點clone全解析

2022-05-03 20:03:10 字數 2649 閱讀 8770

2009-12-18

在開發ns-log專案中,統計分類有複製的功能。由於之前的統計分類中的資料是通過js賦值進去的,之後使用者可能又進行了修改,發現進行節點轉殖時,出現了 無法複製select下拉框值的怪異現象。本文對這個怪異現象進行解析和給出解決辦法。

使用節點的clonenode(true/false)進行轉殖時,目前是下面的表現情況:

select為設定初始值或者初始值是第乙個option。 表現:各大瀏覽器都沒什麼問題。

select初始值不是在第乙個option。 表現:ie下無法轉殖,其他核心的瀏覽器沒什麼問題。

select的值被使用者或者js修改。 表現:各個瀏覽器均無法轉殖到真確的值。值結果跟第二條結果相同。

對於上面第二條,初始值不在第乙個option時無法轉殖的情況,確實是ie的乙個bug,相信不少人都遇到過這樣的問題。並且ie下使用clonenode方法時,還有event方面的問題,所以差不多可以放棄使用這個方法。

ie下可以使用節點的outerhtml屬性解決這個問題,它能夠實時的獲取節點的內容,哪怕是select的值被使用者或者程式改變。下面給出簡單的實現。

function clone(node) 

既然ie核心的瀏覽器可以通過outerhtml屬性來解決這個問題,那ff等瀏覽器可以通過類似的方法來實現嗎?雖然ff等瀏覽器沒有outerhtml屬性,但是可以通過innerhtml屬性實現,如:

function getouterhtml(node)  catch (e) 

}

答案是否定。

為什麼會這樣呢?難道是ff等瀏覽器的bug?

下面還是從w3c中對clonenode方法,select標籤,屬性的定義進行說明。

下面引用的資料都是來自html5草案,html4或者xhtml對這些沒有太多詳細的定義。雖然是html5的,但這些節點跟以前沒什麼變化。

裡面有2點比較重要:

轉殖時會拷貝節點的所有屬性和對應的值。

如果clonenode方法的引數為true,會通過遞迴的方法轉殖子節點。

w3c對於屬性的定義有2種,一種是內容性屬性(content attributes),另一種是操作性屬性(未給出具體的命名,這裡暫時使用這個名字)。

對於select標籤,內容性屬性主要有:global attributes,autofocus,disabled,form,multiple,name,size。其中global attributes包含一些常用的屬性(accesskey,class,contenteditable,contextmenu,dir,draggable,hidden,id,itemid, itemprop,itemref,itemscope,itemtype,lang,spellcheck,style,tabindex,title),這些屬性是所有標籤裡都包含的,具體的見

而selectedindex和value都屬於操作性屬性,這兩個屬性獲取值的方式如下:

select . selectedindex[ = value ]

returns the index of the first selected item, if any, or −1 if there is no selected item. can be set, to change the selection.

select . value [ = value ]

returns the value of the first selected item, if any, or the empty string if there is no selected item. can be set, to change the selection.

給節點新增屬性有兩種方式,如下面所示:

var div = document.createelement('div')

div.id = 'welefen'; //直接加屬性

div.setattribute('id','welefen'); //通過setattribute方法新增屬性

對於內容性屬性,這兩種方法是完全相同的。

但對於操作性屬性,第一種方式只會將屬性新增在操作範圍內,當把節點新增到dom中,屬性就失效了。

由於selectedindex和value都是操作性屬性,如果select的值被使用者或者程式改變,clone時當前的值是無法帶過去的。所以才會出現了無法轉殖值的情況。並且也無法使用innerhtml來轉殖值,因為innerhtml的原理跟這個是一樣的。

innerhtml實現原理請看這裡:

目前有2中解決方案,第一種是在select繫結change事件,觸發change的時候,改變options裡的selected屬性,當然這種方法是很不可取的。另一種方案就是在轉殖時獲取元素的值,然後再賦值到轉殖後的物件上去。

function cloneselect(select) 

var cloneselect = select.clonenode(true);

cloneselect.selectedindex = select.selectedindex;

cloneselect.value = select.value;

return cloneselect;

}

PD3 0詳解 電源規則,全解!!!全解!!!

大師匈今天談一下pd3.0的電源規則,pd3.0標準標定的規則。usb協會聲稱,為了世界和平世界環境,讓大家用上統一標準的充電器,不用再為每乙個用電裝置都配乙個專門的充電器,這些充電器各種各樣的都有,所以有時候大師匈也很煩!那麼為了維護世界和平,usb協議呢就制訂了這個pd快充協議,還有它的規則,只...

Berkeley DB使用全解

在開發桌面級應用程式時,常常需要用到可持續儲存技術,做為儲存程式在退出之前所使用的資料,如變數,物件,視窗位置,大小.一般我們會使用office access這類桌面型檔案資料庫,或者是使用登錄檔.但是它們都有一些不盡人意的缺陷.比如 1.mdb檔案無法在沒有安裝office的系統上訪問,直少得需要...

《Java》反射全解

public class person public person string name private person int age class clazz person.class constructor c clazz.getconstructor null 得到無參 constructor...