简体   繁体   中英

how to completely remove

please help to remove the new Bullet. jsfiddle

after the object it moves across the screen from the bottom up. coordinate with y <= 5px method works helper.deleteElement (), but the object is still there exists (see the console - console.log ('move') ;)

I need to to be removed completely

js:

Bullet = function(bulletId){ 
    var self = this;

    self.id = bulletId; 
    self.x = 100;   
    self.y = 500;   

    self.move = function(){ 
        console.log('move');

        var offsetY = -10,
            newY = self.y + offsetY;

        if(newY <= 5){
            helper.deleteElement(self.id);

            if(observerable.removeListener(this, "makeMoveBullet", "move")){
                console.log('dont worked!');
            }
        }   

        self.y = newY;

        self.render(self.x, newY);      

        return;
    };      

    self.render = function(x, y){       
        $('#' +self.id).css({
            'left': (self.x = x || self.x) + 'px',
            'top': (self.y = y || self.y) + 'px'
        }).appendTo('#wrap');   

        return;
    };

    self.init = function(playerX, playerY){
        $('<div class="bullet" id="' + self.id + '"  />').appendTo('#wrap');

        self.x = playerX + 31;
        self.y = playerY - 9;

        self.render(self.x, self.y);

        return;
    };
}; 


// ------------------------------------------------------------------------------------ observer
var observerable = {
    listeners: {},

    addListener: function (object, evt, callback) {       
        if (!this.listeners.hasOwnProperty(evt)) {           
            this.listeners[evt] = [];    
        }        

        this.listeners[evt].push(object[callback]);       
    },

    removeListener: function (object, evt, callback) {       
        if (this.listeners.hasOwnProperty(evt)) {      
            var i, length;     
                    
            for (i = 0, length = this.listeners[evt].length; i < length; i += 1) {               
                if (this.listeners[evt][i] === object[callback]) {                   
                    this.listeners[evt].splice(i, 1);        
                }      
            }    
        }  
    },
        
    publisher: function (evt, args) {       
        if (this.listeners.hasOwnProperty(evt)){                       
            var i, length;       
                                      
            for (i = 0, length = this.listeners[evt].length; i < length; i += 1){                
                this.listeners[evt][i](args);      
            }            
        }                            
    }
}; 

// ------------------------------------------------------------------------------------ helper
function Helper(){
    this.deleteElement = function(id){
        $('#' + id).remove();

        return;
    };  
};

// ------------------------------------------------------------------------------------ init
var helper = new Helper();


bullet = new Bullet('bullet_0'); 

bullet.init(500, 500);


observerable.addListener(bullet, "makeMoveBullet", "move"); 

setInterval(function(){
    observerable.publisher("makeMoveBullet");
}, 100);

JavaScript uses a Garbage Collector to remove unused variables. I would say to do something like this:

delete this.x; delete this.y ; ... ; delete this;

When you want to remove the object (also remove it from any other external data structures). Remove all it's properties then the object itself. Then the GC should remove it.

setInterval returns an interval identifier. Clear the interval using clearInterval function when you don't want more executions of the interval.

var int = setInterval(...);
...
clearInterval(int);
removeListener: function (object, evt, callback) {
    if (this.listeners.hasOwnProperty(evt)) {
        var i, length;

        for (i = 0, length = this.listeners[evt].length; i < length; i += 1) {
            if (this.listeners[evt][i] === object[callback]) {
                this.listeners[evt].splice(i, 1);
            }
        }
    }
}

object[callback] is always undefined so this.listeners[evt].splice(i, 1); cannot be executed;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM