zoukankan      html  css  js  c++  java
  • JavaScript 函数直接量在FF引发的错误

    在我前几天的一篇博文中 通过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  ifnull==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  ifnull==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下是不能直接将函数指针指定赋予一个变量的 ?

    <h3>
       心静似高山流水不动,心清若巫峰雾气不沾。
    </h3>
  • 相关阅读:
    xapian的使用
    Andriod 环境配置以及第一个Android Application Project
    2013Esri全球用户大会之ArcGIS for Server&Portal for ArcGIS
    window server 2012 更改密钥 更改系统序列号
    持续集成之路——数据访问层的单元测试(续)
    多项式相乘与相加演示
    hdu 1847 博弈基础题 SG函数 或者规律2种方法
    solaris之cpu
    Android音效SoundPool问题:soundpool 1 not retry
    poj1845-Sumdiv
  • 原文地址:https://www.cnblogs.com/McJeremy/p/1518913.html
Copyright © 2011-2022 走看看