Просмотр исходного кода

HUE-47
FitText is not garbage collecting elements for the FitText-Children filter because it's attaching the cleanup function to the wrong element.

Aaron Newton 15 лет назад
Родитель
Сommit
24d5678171

+ 16 - 9
desktop/core/static/js/Source/BehaviorFilters/Behavior.FitText.js

@@ -24,8 +24,15 @@ script: Behavior.FitText.js
 */
 
 (function(){
-	//implements the FitText filter on an element; attaches to the jframe for events on resize
-	var fitIt = function(filter, element, events){
+	/*
+		implements the FitText filter on an element; attaches to Behavior for events on resize
+		filter - the Behavior filter instance
+		element - the element to instantiate FitText against
+		methods - the Behavior methods object passed into the filter
+		garbageElement - (optional) if the element passed to the filter is not the one having 
+		     FitText applied, pass in the filter element for garbage collection marking
+	*/
+	var fitIt = function(filter, element, methods, garbageElement){
 		if (element.get('tag') == 'td' || element.getParent('table')) {
 			fixTable(element.getParent('table'));
 			if (element.get('tag') == 'td') element.setStyles(tdStyles);
@@ -61,9 +68,9 @@ script: Behavior.FitText.js
 				//rerun this after a while, as some filters muck about w/ the DOM
 				//I'm not crazy about this solution, but it'll have to do for now
 				fitTextFit.delay(10); 
-				events.addEvent('show', fitTextFit);
-				filter.markForCleanup(element, function(){
-					events.removeEvent('show', fitTextFit);
+				methods.addEvent('show', fitTextFit);
+				filter.markForCleanup(garbageElement || element, function(){
+					methods.removeEvent('show', fitTextFit);
 				});
 			}
 		};
@@ -89,18 +96,18 @@ script: Behavior.FitText.js
 			elements cannot have child elements (only text)
 		*/
 
-		FitText: function(element, events) {
-			fitIt(this, element, events);
+		FitText: function(element, methods) {
+			fitIt(this, element, methods);
 		},
 
 		/*
 			finds all elements wth data-fit-text properties - these properties must be selectors
 			for the elements to apply the FitText class to.
 		*/
-		'FitText-Children': function(element, events){
+		'FitText-Children': function(element, methods){
 			var selector = element.get('data', 'fit-text');
 			element.getElements(selector).each(function(el){
-				fitIt(this, el, events);
+				fitIt(this, el, methods, element);
 			}, this);
 		}
 

+ 3 - 4
ext/thirdparty/js/fittext/Source/FitText.js

@@ -40,8 +40,8 @@ var FitText = new Class({
 		this.bound = this.fit.bind(this);
 		
 		this.elements.each(function(element){
-			element.store('scrollWidth',element.getSize().x).store('text',element.get('text'));
-		}.bind(this));
+			element.store('scrollWidth',element.getSize().x).store('text',element.get('text')).store('FitText', this);
+		}, this);
 
 		this.attach();
 		this.fit();
@@ -61,8 +61,7 @@ var FitText = new Class({
 				element.removeClass(this.options.fitClass);
 				element.set('text',text);
 			}
-
-		}.bind(this));
+		}, this);
 
 		return this;
 	},