JavaScript 函數直接量在FF引發的錯誤

來源:互聯網
上載者:User

在我前幾天的一篇博文中 通過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下是不能直接將函數指標指定賦予一個變數的 ?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.