Index: js/Commands.js
===================================================================
--- js/Commands.js	(revision 1596)
+++ js/Commands.js	(working copy)
@@ -4,13 +4,13 @@
 
 config.commands.closeTiddler.handler = function(event,src,title)
 {
-	story.closeTiddler(title,true,event.shiftKey || event.altKey);
+	story.closeTiddler(title,true,event.shiftKey || event.altKey,true);
 	return false;
 };
 
 config.commands.closeOthers.handler = function(event,src,title)
 {
-	story.closeAllTiddlers(title);
+	story.closeAllTiddlers(title,true);
 	return false;
 };
 
Index: js/Macros.js
===================================================================
--- js/Macros.js	(revision 1596)
+++ js/Macros.js	(working copy)
@@ -253,7 +253,7 @@
 
 config.macros.closeAll.onClick = function(e)
 {
-	story.closeAllTiddlers();
+	story.closeAllTiddlers(null,true);
 	return false;
 };
 
Index: js/Story.js
===================================================================
--- js/Story.js	(revision 1596)
+++ js/Story.js	(working copy)
@@ -398,7 +398,8 @@
 //# title - name of tiddler to close
 //# animate - whether to perform animations
 //# slowly - whether to perform animations in slomo
-Story.prototype.closeTiddler = function(title,animate,slowly)
+//# allowAsync - when true closing the tiddler will occur asynchronously (i.e. possibly after this function returned). (Pass true here as often as possible as it gets rid of the problem described in ticket #301)
+Story.prototype.closeTiddler = function(title,animate,slowly,allowAsync)
 {
 	var tiddlerElem = document.getElementById(this.idPrefix + title);
 	if(tiddlerElem != null) {
@@ -406,10 +407,16 @@
 		this.scrubTiddler(tiddlerElem);
 		if(config.options.chkAnimate && animate && anim && typeof Slider == "function")
 			anim.startAnimating(new Slider(tiddlerElem,false,slowly,"all"));
-		else
-			tiddlerElem.parentNode.removeChild(tiddlerElem);
+		else {
+			//# bugfox for ticket #301: set overflow=hidden and use asynch redraw (if allowed)
+			tiddlerElem.style.overflow = "hidden";
+			if (allowAsync)
+				setTimeout(function(){tiddlerElem.parentNode.removeChild(tiddlerElem)},0);
+			else
+				tiddlerElem.parentNode.removeChild(tiddlerElem);
+		}
 	}
-};
+}
 
 //# Scrub IDs from a tiddler. This is so that the 'ghost' of a tiddler while it is being closed
 //# does not interfere with things
@@ -450,13 +457,15 @@
 };
 
 //# Close all tiddlers in the story
-Story.prototype.closeAllTiddlers = function(exclude)
+//# exclude - title of tiddler that should not be closed (i.e. the "close others" case)
+//# allowAsync - when true closing the tiddler will occur asynchronously (i.e. possibly after this function returned).  (Pass true here as often as possible as it gets rid of the problem described in ticket #301)
+Story.prototype.closeAllTiddlers = function(exclude,allowAsync)
 {
 	clearMessage();
 	this.forEachTiddler(function(title,element) {
 		if((title != exclude) && element.getAttribute("dirty") != "true")
-			this.closeTiddler(title);
-	});
+			this.closeTiddler(title,false,false,allowAsync);
+		});
 	window.scrollTo(0,ensureVisible(this.container));
 };
 
