2014-03-05 106 views
0

因为您即将成为我相当新的编码as3 ...我总是会遇到这些错误,当我尝试删除孩子...
我现在不使用类,只是使用包含方法。
TypeError:错误#1006:removeChild不是函数。 任何人都可以向我解释如何正确使用它?如果这不是一个如此广泛的问题。AS3儿童错误

var children = 0; 

function pineClick(e:MouseEvent):void { 
var chopBtn:MovieClip = new MenuItem ; 
var shakeBtn:MovieClip = new MenuItem ; 
var pineCancelBtn:MovieClip = new MenuItem ; 


if (chopMode == false && children <1) { 
    children++; 
    addChild(chopBtn); 
    chopBtn.x = 250; 
    chopBtn.y = 140; 
    chopBtn.MenuItemText.text = "Chop"; 
    addChild(shakeBtn); 
    shakeBtn.x = 250; 
    shakeBtn.y = 200; 
    shakeBtn.MenuItemText.text = "Shake"; 
    addChild(pineCancelBtn); 
    pineCancelBtn.x = 250; 
    pineCancelBtn.y = 260; 
    pineCancelBtn.MenuItemText.text = "Cancel"; 
    pineCancelBtn.addEventListener(MouseEvent.CLICK, pineCancelClick); 
    chopBtn.addEventListener(MouseEvent.CLICK, pineChopClick); 


    function pineChopClick(e:MouseEvent):void { 

     var length:uint = inventoryItems.length; 
     for (var i:uint= 0; i<length; i++) { 
      if (inventoryItems[i] == "Hatchet") { 
       itemEquipped = true; 
      } 
      if (itemEquipped == true) { 
       chopMode = true; 
       removeChild(shakeBtn);  /////error here////// 
       removeChild(pineCancelBtn); ///////////////////// 
       removeChild(chopBtn);   ///////////////////// 
      } else { 
       itemEquipped = false; 
      } 
     } 
     if (itemEquipped == false) { 
      Output.text = insertTextBefore("You need a Hatchet to cut this."); 
     } 
    } 



    function pineCancelClick(e:MouseEvent):void { 
     chopMode = false; 
     removeChild(chopBtn); 
     removeChild(shakeBtn); 
     removeChild(pineCancelBtn); 
     children = 0; 
    } 
} 
if (chopMode == true) { 
    removeChild(chopBtn); 
    removeChild(shakeBtn); 
} 
} 
+0

做'shakeBtn'痕迹后才能取出。你有没有'null'的东西? – Houseman

回答

0

您的问题是范围的直接问题。由于嵌套函数,内部函数失去了范围。
这正是我们永远不会嵌套函数的原因。
如果未嵌套的功能,你的问题就会迎刃而解

或者你可以试试这个。

MovieClip(root).removeChild(XXXXX) 
+0

我对此很好奇。由于他试图删除的孩子被声明在他的代码的顶部,他们怎么会在深度嵌套函数中“超出范围”?谢谢,c.u. – Craig

+0

@Craig孩子在pineClick函数内声明。因此对这些对象的引用(IE:chopBtn,shakeBtn,pineCancelBtn)只能从该函数内部访问。所以你在考虑的是函数pineChopClick也是在里面声明的,它也应该能够引用这些变量,但它确实如此。该函数在外部函数运行并被垃圾收集后很长的点击事件中调用。希望这可以帮助你更好地理解。 –

0

这是一个有点哈克,但这应该做的伎俩

if(shakeBtn.parent != null) 
    shakeBtn.parent.removeChild(shakeBtn); 
+0

这工作谢谢!我的编码技能还不是很好。我应该更多地了解容器。 – Apf42589

+0

这是有效的,但如果你想使任何事情变得更加复杂,你应该真的在使用类。 为什么它没有工作是因为它可能已经从某个地方被删除,并且你不能从不在你父母身上的removeChild()中移除。 也许你只是想有一个单一的函数RemoveButtons(),例如,所以你不必在3个不同的地方有相同的代码片段,而当你需要删除它只是调用该函数。 – ToniK