将事件侦听器添加到多维数组
Adding event listener to a multidimensional array
我想知道在actionscript3中是否可以循环遍历多维数组并添加事件监听器,如果可以,我的方法是否正确?
var localSegment:Array = [segment1.system_Cab, segment1.programs_Cab, segment1.userFiles_Cab, segment1.rollback_Cab]
var external_MediaSegment:Array = [segment2.externalHD_Cab, segment2.virtualDisk_Cab]
var network_LocationSegment:Array = [segment3.homeServer_Cab, segment3.wifiFlashdrive_Cab, segment3.encrivaPlay_Cab]
var superVolumes:Array = [localSegment, external_MediaSegment, network_LocationSegment]
for (var i:Number = 0; i < superVolumes.length; i++ ){
var fmCabinent = superVolumes[i];
fmCabinent.addEventListener(MouseEvent.CLICK, openCabinet);
}
var targetCabinent;
function openCabinet (e:MouseEvent):void{
targetCabinent = e.currentTarget;
if (targetCabinent.currentFrame == 1){
targetCabinent.play();
}
您不能将点击侦听器添加到数组。
查看您的代码,您循环遍历外部数组 superVolumes
,并尝试为其成员添加点击侦听器,但它的所有成员也是数组。
您可以做的是嵌套循环(循环中的循环)并将侦听器添加到这些子数组中可能显示的对象。
for (var i:int = 0; i < superVolumes.length; i++ ){
for(var j:int = 0; j < superVolumes[i].length; j++){
superVolumnes[i][j].addEventListener(MouseEvent.CLICK, openCabinet);
}
}
要确定点击的对象属于哪个数组,您可以在点击处理程序中执行如下操作:
//create a var to reference the clicked item's parent array
var arrayContainer:Array;
//a temporary variable to store the index of clicked object
var curIndex:int;
//loop through the superVolumes array
for (var i:int = 0; i < superVolumes.length; i++ ){
//see if the sub array contains the clicked item
curIndex = superVolumes[i].indexOf(e.currentTarget);
//indexOf returns -1 if the item is not found in the array
if(curIndex > -1){
//if the sub array contains the clicked item (e.currentTarget)
arrayContainer = superVolumes[i][curIndex];
break; //stop looping since you found the array
}
}
//now do whatever you need to do with the array
switch(arrayContainer){
case localSegment:
trace("You clicked an item from local segment");
break;
case external_MediaSegment:
trace("YOu clicked something from media segment");
break;
default:
trace("You clicked something from network_LocationSegment");
}
关于理解上面的[j]
代表什么,你可以改写成这样更清楚:
for (var iterator:int = 0; iterator < superVolumes.length; iterator++ ){
//the members of superVolumes are all arrays
//get the sub array at current index ('iterator') and assign it to a variable
var curArray:Array = superVolumes[iterator] as Array;
//now loop through this sub array
//since we have 'iterator' (previously 'i') as the iterator/index name in the outer loop
//we need a different name for the iterator on the inner loop
//let's call this iterator 'innerIterator' (previously 'j')
for(var innerIterator:int = 0; innerIterator < curArray.length; innerIterator++){
curArray[innerIterator].addEventListener(MouseEvent.CLICK, openCabinet);
}
}
我想知道在actionscript3中是否可以循环遍历多维数组并添加事件监听器,如果可以,我的方法是否正确?
var localSegment:Array = [segment1.system_Cab, segment1.programs_Cab, segment1.userFiles_Cab, segment1.rollback_Cab]
var external_MediaSegment:Array = [segment2.externalHD_Cab, segment2.virtualDisk_Cab]
var network_LocationSegment:Array = [segment3.homeServer_Cab, segment3.wifiFlashdrive_Cab, segment3.encrivaPlay_Cab]
var superVolumes:Array = [localSegment, external_MediaSegment, network_LocationSegment]
for (var i:Number = 0; i < superVolumes.length; i++ ){
var fmCabinent = superVolumes[i];
fmCabinent.addEventListener(MouseEvent.CLICK, openCabinet);
}
var targetCabinent;
function openCabinet (e:MouseEvent):void{
targetCabinent = e.currentTarget;
if (targetCabinent.currentFrame == 1){
targetCabinent.play();
}
您不能将点击侦听器添加到数组。
查看您的代码,您循环遍历外部数组 superVolumes
,并尝试为其成员添加点击侦听器,但它的所有成员也是数组。
您可以做的是嵌套循环(循环中的循环)并将侦听器添加到这些子数组中可能显示的对象。
for (var i:int = 0; i < superVolumes.length; i++ ){
for(var j:int = 0; j < superVolumes[i].length; j++){
superVolumnes[i][j].addEventListener(MouseEvent.CLICK, openCabinet);
}
}
要确定点击的对象属于哪个数组,您可以在点击处理程序中执行如下操作:
//create a var to reference the clicked item's parent array
var arrayContainer:Array;
//a temporary variable to store the index of clicked object
var curIndex:int;
//loop through the superVolumes array
for (var i:int = 0; i < superVolumes.length; i++ ){
//see if the sub array contains the clicked item
curIndex = superVolumes[i].indexOf(e.currentTarget);
//indexOf returns -1 if the item is not found in the array
if(curIndex > -1){
//if the sub array contains the clicked item (e.currentTarget)
arrayContainer = superVolumes[i][curIndex];
break; //stop looping since you found the array
}
}
//now do whatever you need to do with the array
switch(arrayContainer){
case localSegment:
trace("You clicked an item from local segment");
break;
case external_MediaSegment:
trace("YOu clicked something from media segment");
break;
default:
trace("You clicked something from network_LocationSegment");
}
关于理解上面的[j]
代表什么,你可以改写成这样更清楚:
for (var iterator:int = 0; iterator < superVolumes.length; iterator++ ){
//the members of superVolumes are all arrays
//get the sub array at current index ('iterator') and assign it to a variable
var curArray:Array = superVolumes[iterator] as Array;
//now loop through this sub array
//since we have 'iterator' (previously 'i') as the iterator/index name in the outer loop
//we need a different name for the iterator on the inner loop
//let's call this iterator 'innerIterator' (previously 'j')
for(var innerIterator:int = 0; innerIterator < curArray.length; innerIterator++){
curArray[innerIterator].addEventListener(MouseEvent.CLICK, openCabinet);
}
}