Вызвана текущая функция ActionScript 3.0, плюс все предыдущие - PullRequest
0 голосов
/ 15 мая 2009

Хорошо, я не знаю, как я это сделал, возможно, боги AS3 разозлились на меня, когда моя полоса прокрутки сработала сразу после того, как я ее кодировал, без ошибок. Но у меня очень странная проблема. У меня есть три разные кнопки, они не вложены друг в друга, и у них есть прослушиватели событий для щелчков мыши, которые вызывают функцию. Всякий раз, когда нажимается одна из этих 3 кнопок, она вызывает функцию, которая должна добавить все предыдущие из жизни SWF. Я понятия не имею, как это происходит, если честно, я в шоке, я, я в шоке. Как это происходит? Что-то с eventListeners? Возможно что-то с URLLoader? Я не знаю, я проследил каждый шаг и у меня ничего нет, поэтому я бросаюсь перед судом более умных программистов в надежде, что один из вас, уважаемые джентльмены и джентельмены, знает, что я делаю неправильно, пожалуйста пожалей душу бедного кодера.

Файл класса документа Pastie

package {

    import gs.TweenMax;
    import gs.easing.*;
    import flash.display.*;
    import flash.events.*;
    import flash.ui.Keyboard;
    import flash.net.*;
    import flash.external.ExternalInterface;
    import FullScreenScrollBar;

    public class Gessner extends MovieClip {

        //====================================Declare Variables================================//
        var objectsArray:Array = ["whatwedo_bkg", "whoweare_bkg", "howmuch_bkg", "needsome_bkg"];
        var images:Array = [];
        var instances:Array = [];
        var imageInstances:Array = [];
        var paginationButtons:Array =[];
        //=====================================================================================//

    private var xmlLoader:URLLoader = new URLLoader();
    private var xmlData:XML = new XML();

    //======================================================================================
    public function initXML(e:Event) {
    //======================================================================================
        var target:String = e.currentTarget.name;
        if (e.currentTarget.name == "recent_projects" || e.currentTarget.name == "whoweare") {
            xmlLoader.addEventListener(Event.COMPLETE, onCompleteXML);
            xmlLoader.load(new URLRequest("http://www.gessnerengineering.com/projects"));
        } else if (e.currentTarget.name == "our_staff") {
            xmlLoader.addEventListener(Event.COMPLETE, onCompleteXML);
            xmlLoader.load(new URLRequest("http://www.gessnerengineering.com/profiles"));
        }

        //========================================================================
         function onCompleteXML(e:Event):void {
        //========================================================================
            xmlData = new XML(e.currentTarget.data);
            makePagination();
            trace("onCompleteXML() target: " + target);
            if (target == "recent_projects" || target == "whoweare") {
                trace("loadProjectXML() got called from onCompleteXML();");
                loadProjectsXML(0, xmlData);
            } else if (target == "our_staff") {
                loadStaffXML(0, xmlData);
            }
        }

        //========================================================================
         function makePagination():void {
        //========================================================================
            var pages:Number;
            trace("makePagination() target: " + target);
            if (target == "recent_projects" || target == "whoweare") {
                pages = Math.ceil(xmlData.project.length() / 13);
            } else if (target == "our_staff") {
                pages = Math.ceil(xmlData.profile.length() / 13);
            }
            for (var i:Number = 0; i < pages; i++) {
                var tmp:pageNum = new pageNum();
                var startX:Number = -(((pages * 50) - 10) / 2);
                tmp.Id = i * 13;
                tmp.x = startX;
                startX += 50;
                tmp.y = 0;
                tmp.label.text = String(i+1);
                tmp.buttonMode = true;
                tmp.mouseChildren = false;
                tmp.useHandCursor = true;
                tmp.addEventListener(MouseEvent.CLICK, onChangePage);
                Gessner(root).pages.whoweare_bkg.pagination.addChild(tmp);
                paginationButtons.push(Gessner(root).pages.whoweare_bkg.pagination.getChildByName(tmp.name));
            }
        }

        //========================================================================
        function onChangePage (e:MouseEvent):void {
        //========================================================================
            if (target == "recent_projects" || target == "whoweare") {
                trace("loadProjectXML() got called from onChangePage();");
                loadProjectsXML(e.currentTarget.Id as Number, xmlData);
            } else {
                loadStaffXML(e.currentTarget.Id as Number, xmlData);
            }
        }
    }


    //======================================================================================
    public function loadProjectsXML(startNum:Number, xmlData:XML):void {
    //======================================================================================
        removeAll();
        var index:int = 1;
        var endNum:Number = startNum + 13;
        if (endNum > xmlData.project.length()) {
            endNum = xmlData.project.length();
            //trace("projectENDNUM" + endNum);
        }
        for(startNum; startNum < endNum; startNum++) {
            var instance:String = "cont" + index;
            var imageURL:String = "http://www.gessnerengineering.com/system/files/" + xmlData.project[startNum].assets.asset[0]["id"] + "/thumb/" + xmlData.project[startNum].assets.asset[0]["file-file-name"];

            loadImage(imageURL, instance);
            Gessner(root).pages.whoweare_bkg[instance].title.text = xmlData.project[startNum].name;
            Gessner(root).pages.whoweare_bkg[instance].description.text = xmlData.project[startNum].description;
            instances.push(instance);

            index++;
        }
    }

    //=======================================================================================
    public function loadStaffXML(startNum:Number, xmlData:XML):void {
    //=======================================================================================
        removeAll();
        var index:int = 1;
        var endNum:Number = startNum + 13;
        if (endNum > xmlData.profile.length()) {
            endNum = xmlData.profile.length();
            ////trace("endNUM" + endNum);
        }
        for(startNum; startNum < endNum; startNum++) {
            var instance:String = "cont" + index;
            var imageURL:String = "http://www.gessnerengineering.com/system/avatars/" + xmlData.profile[startNum]["id"] + "/thumb/" + xmlData.profile[startNum]["avatar-file-name"];

            loadImage(imageURL, instance);
            Gessner(root).pages.whoweare_bkg[instance].title.text = xmlData.profile[startNum]["user-id"];
            Gessner(root).pages.whoweare_bkg[instance].description.text = xmlData.profile[startNum]["bio"];
            instances.push(instance);
            index++;
        }
    }

    //=======================================================================================
    private function loadImage(imageURL:String, instance:String):void {
    //=======================================================================================
            var imageLoader:Loader = new Loader();
            var imageRequest = new URLRequest(imageURL);

            imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
            imageLoader.load(imageRequest);

            function onComplete(e:Event) {
                var image:Bitmap = (Bitmap)(e.currentTarget.content);
                Gessner(root).pages.whoweare_bkg[instance].thumb.addChild(image);
                images.push(Gessner(root).pages.whoweare_bkg[instance].thumb.getChildByName(image.name));
                imageInstances.push(instance);
                //imageLoader.unload();
            }
    }

    //=======================================================================================
    private function removeAll():void {
    //=======================================================================================
        var lengthOfIndex:uint = instances.length;
        /*for each(var button:DisplayObject in paginationButtons) {
            Gessner(root).pages.whoweare_bkg.pagination.removeChild(button);
        }*/
        for (var i:uint = 0; i < lengthOfIndex; i++) {              
            Gessner(root).pages.whoweare_bkg[instances[i]]["title"].text = "";
            Gessner(root).pages.whoweare_bkg[instances[i]]["description"].text = "";
            try {
            Gessner(root).pages.whoweare_bkg[imageInstances[i]].thumb.removeChild(images[i]);
            } catch (ArgumentError) {
                //trace("error: " + images[i].name + "::" + instances[i]);
            }
        }
        paginationButtons.splice(0, paginationButtons.length);
        images.splice(0, lengthOfIndex);
        imageInstances.splice(0, lengthOfIndex);
        instances.splice(0, lengthOfIndex);         
    }
}

Действия по срокам документа

this.pages.whoweare_bkg.recent_projects.addEventListener(MouseEvent.CLICK, initXML);
this.pages.whoweare_bkg.our_staff.addEventListener(MouseEvent.CLICK, initXML);
this.whoweare.addEventListener(MouseEvent.CLICK, initXML);

Выход Pastie

##first click
makePagination() target: whoweare
onCompleteXML() target: whoweare
loadProjectXML() got called from onCompleteXML();
projectENDNUM3

##second click
makePagination() target: whoweare
onCompleteXML() target: whoweare
loadProjectXML() got called from onCompleteXML();
projectENDNUM3
makePagination() target: recent_projects
onCompleteXML() target: recent_projects
loadProjectXML() got called from onCompleteXML();
projectENDNUM3

##third click
makePagination() target: whoweare
onCompleteXML() target: whoweare
loadProjectXML() got called from onCompleteXML();
projectENDNUM3
makePagination() target: recent_projects
onCompleteXML() target: recent_projects
loadProjectXML() got called from onCompleteXML();
projectENDNUM3
makePagination() target: recent_projects
onCompleteXML() target: recent_projects
loadProjectXML() got called from onCompleteXML();
projectENDNUM3

##fourth click
makePagination() target: whoweare
onCompleteXML() target: whoweare
loadProjectXML() got called from onCompleteXML();
projectENDNUM3
makePagination() target: recent_projects
onCompleteXML() target: recent_projects
loadProjectXML() got called from onCompleteXML();
projectENDNUM3
makePagination() target: recent_projects
onCompleteXML() target: recent_projects
loadProjectXML() got called from onCompleteXML();
projectENDNUM3
makePagination() target: recent_projects
onCompleteXML() target: recent_projects
loadProjectXML() got called from onCompleteXML();
projectENDNUM3

and so on and so on

Ответы [ 3 ]

2 голосов
/ 15 мая 2009

О, я вижу. Это здесь, в этой части:

xmlLoader.addEventListener(Event.COMPLETE, onCompleteXML);
xmlLoader.load(new URLRequest("http://www.gessnerengineering.com/projects"));

Каждый раз, когда вызывается этот код, вы добавляете НОВЫЙ прослушиватель событий в xmlLoader. Поэтому каждый раз, когда вы вызываете его, он будет вызывать onCompleteXML +1 раза.

1 голос
/ 15 мая 2009

Проверьте, что вы делаете на своей временной шкале, и убедитесь, что у вас есть команда stop(), и избегайте добавления слушателей событий снова.

Каждый раз, когда вы вводите ключевой кадр на временной шкале, ваши слушатели событий добавляются. Поэтому я предполагаю, что вы переходите к другому кадру, а затем возвращаетесь к тому же кадру, который добавляет прослушиватели событий.

1 голос
/ 15 мая 2009

Не похоже, что вы когда-либо удаляете слушателей событий - если вы хотите это делать. Кроме того, какова ваша целевая переменная? Я не вижу, где это объявлено, вы хотите использовать e.currentTarget или что-то еще?

...