在我前幾天的一篇博文中 通過JS動態建立DOM元素備忘
寫了一個動態添加或刪除元素的方法 ,如下:
1function childNodeAction(actionType,parentNode,childNode)
2{
3 if(!parentNode)
4 {return; }
5
6
7 parentNode=typeof parentNode==='string'?getElement(parentNode):parentNode;
8 childNode=typeof childNode==='string'?getElement(childNode):childNode;
9 if(!parentNode || !childNode)
10 {return;}
11
12 var action=actionType.toLowerCase();
13 if( null==actionType || action.length<=0 || action=='append')
14 {
15 action='parentNode.appendChild';
16 }
17 else
18 {
19 action='parentNode.removeChild';
20 }
21
22 try
23 {
24 eval(action)(childNode);
25 }
26 catch($e)
27 {
28 alert($e.message);
29 }
30}
其中的局部變數 action 在根據傳入的動作類型分別初始化為 parentNode.appendChild和parentNode.removeChild 的字串形式。
而實際上,這二個都是一個DOM函數。只不過,我這裡,把函數名以字串的形式賦給action.
在接下來,調用action時,使用了eval來執行對應的函數。
上面這段代碼在IE下執行沒有任何問題,但是,在FF下,卻報:Illegal operation on WrappedNative prototype object 的異常。
到網上搜尋一番,原來,把函數指標直接賦給某個變數(也就是函數直接量)再執行的話,在FF下確實會報這個異常。
變通方法,就是建立一個匿名方法,並將其賦給action變數。如下:
1function childNodeAction(actionType,parentNode,childNode)
2{
3 if(!parentNode)
4 {return; }
5
6
7 parentNode=typeof parentNode==='string'?getElement(parentNode):parentNode;
8 childNode=typeof childNode==='string'?getElement(childNode):childNode;
9 if(!parentNode || !childNode)
10 {return;}
11
12 var action=actionType.toLowerCase();
13 if( null==actionType || action.length<=0 || action=='append')
14 {
15 action=function(childNode){parentNode.appendChild(childNode);}
16 //action='parentNode.appendChild';
17 }
18 else
19 {
20 action=function(childNode){parentNode.removeChild(childNode);}
21 //action='parentNode.removeChild';
22 }
23
24 try
25 {
26 //eval(action)(childNode); sError in FF: 'Illegal operation on WrappedNative prototype object'
27 action(childNode);
28 }
29 catch($e)
30 {
31 alert($e.message);
32 }
33}
這樣,這段代碼在FF下的執行就沒有任何問題了。
類似的情況還有:
var $=document.getElementById;
alert($("demo").innerHTML);
這段代碼也會報一樣的錯誤,變通方法 :
var $=function(obj){ return typeof obj==='string' ? document.getElementById(obj) : obj ;}
或者 document.$=document.getElementById
個人認為:在FF下是不能直接將函數指標指定賦予一個變數的 ?