JavaScript 函数直接量在FF引发的错误
在我前几天的一篇博文中 通过JS动态创建DOM元素备忘
写了一个动态添加或删除元素的方法 ,如下:
1
function 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
}
function 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
else18
{19
action='parentNode.removeChild';20
}21

22
try23
{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变量。如下:
1
function 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
}
function 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
else19
{ 20
action=function(childNode){parentNode.removeChild(childNode);}21
//action='parentNode.removeChild';22
}23
24
try25
{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下是不能直接将函数指针指定赋予一个变量的 ?
<h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>



浙公网安备 33010602011771号