fix: calling viewer.destroy() multiple times throw an error. And a simple destroy to mousetracker

This commit is contained in:
Luke Murray 2013-08-08 17:49:24 +10:00
parent 4ccb141a42
commit 68f9d675fc
3 changed files with 35 additions and 22 deletions

View File

@ -91,26 +91,20 @@ $.EventHandler.prototype = {
/** /**
* Remove all event handler for a given event type. * Remove all event handler for a given event type. If no type is given all event handlers for every event type is removed
* @function * @function
* @param {String} eventName - Name of event for which all handlers are to be removed. * @param {String} eventName - Name of event for which all handlers are to be removed.
*/ */
removeAllHandlers: function( eventName ) { removeAllHandlers: function( eventName ) {
if (eventName){
this.events[ eventName ] = []; this.events[ eventName ] = [];
}, } else{
/**
* Remove every event handler for all event types
* @function
*/
removeAllHandlersForAllEvents: function( ) {
for (var eventType in this.events) { for (var eventType in this.events) {
this.events[eventType] = []; this.events[eventType] = [];
} }
}
}, },
/** /**
* Retrive the list of all handlers registered for a given event. * Retrive the list of all handlers registered for a given event.
* @function * @function

View File

@ -171,6 +171,15 @@
$.MouseTracker.prototype = { $.MouseTracker.prototype = {
/**
* Clean up any events or objects created the mouse tracker
* @function
*/
destroy: function() {
stopTracking( this );
this.element = null;
},
/** /**
* Are we currently tracking events on this element. * Are we currently tracking events on this element.
* @deprecated Just use this.tracking * @deprecated Just use this.tracking

View File

@ -499,7 +499,9 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype,
this.viewport = this.preserveViewport ? this.viewport : null; this.viewport = this.preserveViewport ? this.viewport : null;
//this.profiler = null; //this.profiler = null;
if (this.canvas){
this.canvas.innerHTML = ""; this.canvas.innerHTML = "";
}
VIEWERS[ this.hash ] = null; VIEWERS[ this.hash ] = null;
delete VIEWERS[ this.hash ]; delete VIEWERS[ this.hash ];
@ -518,19 +520,27 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype,
destroy: function( ) { destroy: function( ) {
this.close(); this.close();
this.removeAllHandlersForAllEvents(); this.removeAllHandlers();
// Go through top element (passed to us) and remove all children // Go through top element (passed to us) and remove all children
// Use removeChild to make sure it handles SVG or any non-html // Use removeChild to make sure it handles SVG or any non-html
// also it performs better - http://jsperf.com/innerhtml-vs-removechild/15 // also it performs better - http://jsperf.com/innerhtml-vs-removechild/15
if (this.element){
while (this.element.firstChild) { while (this.element.firstChild) {
this.element.removeChild(this.element.firstChild); this.element.removeChild(this.element.firstChild);
} }
}
// remove the mouse trackers - should we be cleaning up their callbacks? // destroy the mouse trackers
delete this.keyboardCommandArea.innerTracker; if (this.keyboardCommandArea){
delete this.innerTracker; this.keyboardCommandArea.innerTracker.destroy();
delete this.outerTracker; }
if (this.innerTracker){
this.innerTracker.destroy();
}
if (this.outerTracker){
this.outerTracker.destroy();
}
// clear all our references to dom objects // clear all our references to dom objects
this.canvas = null; this.canvas = null;