In JavaScript any undeclared variable you assign to will automatically get global scope. I left some variables intentionally undeclared in the script, to make it resistant against appearing multiple times on the page. The initialization can only be run once, as it removes all the Diagram definitions and replaces them by the actual images. But global declarations of a variable would also be seen in the second and later loading, and then destroy the value the initial loading and initialization set these to. When the array that holds all the collected original Diagram definitions was erased that way, none of the Diagrams of the page would work anymore.
This problem occurred when loading is so slow that some later loadings of the script occur after initialization (which is done after some delay) has already been done. I would have expected that using an 'onload' handler for calling the Init() routine, rather than performing it after some timeout, would solve that. But I could never get this to work. It is also a pain that for multiple loadings the last loaded script would prevail; I would prefer the first-loaded script to prevail. In general that would be the one that is in the article, and it is a bad thing that anyone could post a Comment to the page that could wreck it, by posting a Diagram that uses some obsolete version of the script.
I suppose this could be done by wrapping the entire script in a function, so that none of the declarations (also those of functions) become local to that wrapper. The wrapper frunction could then assign the functions that need to be global to undeclared global variables to provide access to those for the event handlers, and take measures that would make it return immediately when called a second time. Like
function script() { // wrapper for the entire script
if(initDone) return;
initDone = 1;
F = function (args) { .... }; // declare functions and make them global
G = function (args) { .... };
Init = function (args) { .... };
setTimeout('Init()', 500); // run Init after 500 msec
}
script(); // call it
But this would still offer no protection against older versions of the script that explicitly declare F and G as globals ("function F(args) {...}"), and are loaded later. Unless I would change the name of all functions that need to be accessed globally.
Declaring something as global in script embedded in the article should be harmless, as this will only be seen by the browser's JavaScript engine once.
In JavaScript any undeclared variable you assign to will automatically get global scope. I left some variables intentionally undeclared in the script, to make it resistant against appearing multiple times on the page. The initialization can only be run once, as it removes all the Diagram definitions and replaces them by the actual images. But global declarations of a variable would also be seen in the second and later loading, and then destroy the value the initial loading and initialization set these to. When the array that holds all the collected original Diagram definitions was erased that way, none of the Diagrams of the page would work anymore.
This problem occurred when loading is so slow that some later loadings of the script occur after initialization (which is done after some delay) has already been done. I would have expected that using an 'onload' handler for calling the Init() routine, rather than performing it after some timeout, would solve that. But I could never get this to work. It is also a pain that for multiple loadings the last loaded script would prevail; I would prefer the first-loaded script to prevail. In general that would be the one that is in the article, and it is a bad thing that anyone could post a Comment to the page that could wreck it, by posting a Diagram that uses some obsolete version of the script.
I suppose this could be done by wrapping the entire script in a function, so that none of the declarations (also those of functions) become local to that wrapper. The wrapper frunction could then assign the functions that need to be global to undeclared global variables to provide access to those for the event handlers, and take measures that would make it return immediately when called a second time. Like
But this would still offer no protection against older versions of the script that explicitly declare F and G as globals ("function F(args) {...}"), and are loaded later. Unless I would change the name of all functions that need to be accessed globally.
Declaring something as global in script embedded in the article should be harmless, as this will only be seen by the browser's JavaScript engine once.