On Monday, 22 March 2010 02:40:14 UTC, Saverio wrote: > > I am using Eric Shulman's > http://www.tiddlytools.com/#ToggleScrollingSidebars. > The toggle does not immediately take effect. It appears that I need > to open a tiddler before the new setting (either on or off) is > enforced. This is not the way the plugin behaves on the tiddlytools > website. > > Please see: http://dl.dropbox.com/u/4462381/example.html > > for the minimal tiddlywiki file that shows the problem on Firefox 3.6. > I've hit the same problem, with a TiddlyWiki based off 2.6.5 running under Firefox 16.0.2 (with the TiddlyFox 1.0alpha3 extension). I found a fix which works for me. It may not work with other browsers/versions, but it's unlikely to make anything worse.
The failure process I'm seeing is as follows. * The ToggleScrollingSidebars tiddler gets "rendered" twice. * Both times it patches the onchange callback, then calls the method to set the behaviour based on the current config option value. * The second time, it patches it to call through to the patch method, not the original onchange. * Therefore, clicking the checkbox gets you into infinite recursion, and never sets the scrolling behaviour. If you open Firebug, you'll see a "too much recursion" error message in the console. The reason the patching goes wrong on the second pass, despite the check "if (!chk.coreOnChange) { // only once", is as follows. * On the first run through, chk.coreOnChange is undefined and chk.onchange is null. So, {{!chk.coreOnChange}} is {{true}}. Therefore chk.coreOnChangeis set to null and chk.onchange is set to the function in ToggleScrollingSidebars. * On the first run through, chk.coreOnChange is null and chk.onchange is the function in ToggleScrollingSidebars. So, {{!chk.coreOnChange}} is ... still {{true}}! Therefore chk.coreOnChangeis set to the function in ToggleScrollingSidebars (because that was the value of chk.onchange) and chk.onchange is set to ... the same function in ToggleScrollingSidebars -- probably a different function object, but the same behaviour. * When that function is called by clicking the checkbox, its first line, "if (this.coreOnChange) this.coreOnChange.apply(this,arguments);" ends up calling that function itself, because that's now the value in {{this.coreOnChange}} ... which calls itself again ... whcih .... There are a few ways you could fix this. I've done so by changing "if (!chk.coreOnChange) { // only once" to "if (!chk.patchedOnChange) { // only once" and adding a line "chk.patchedOnChange=true;" inside the if, like this: ... '';}}>><<option chkScrollSidebars>><<tiddler {{ var chk=place.lastChild; if (!chk.patchedOnChange) { // only once chk.patchedOnChange=true; chk.coreOnChange=chk.onchange; chk.onchange=function() { if (this.coreOnChange) this.coreOnChange.apply(this,arguments); this.checked=config.options.chkScrollSidebars; window.ToggleScrollingSidebars_setscroll(); }; } window.ToggleScrollingSidebars_setscroll(); '';}}>> $1 !end ... Hope that helps somebody out there -- it took me a few hours to work out! -- You received this message because you are subscribed to the Google Groups "TiddlyWiki" group. To view this discussion on the web visit https://groups.google.com/d/msg/tiddlywiki/-/JqIOG0D2gPMJ. To post to this group, send email to tiddlywiki@googlegroups.com. To unsubscribe from this group, send email to tiddlywiki+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/tiddlywiki?hl=en.