Okay so here is the situation.
I have a language toggle link embedded into a page, it changes the string of the URL from -eng.shtml to -fra.shtml along with the Alias value.
Now basically in the header i’m calling two scripts:
<script type="text/javascript" src="/js/langDB.js"></script>
<script type="text/javascript" src="/js/langToggle.js"></script>
LangToggle.js has a function within langDB.js but when the function programmed into langDB.js is called it doesn’t quite work as expected, it’s function should be to change the variable value from one to another.
Toggle code:
function js_changeit(){
//Get the current page full URL
var mainName = String(window.location);
//Base name
var slash = mainName.lastIndexOf("/");
var dot = mainName.lastIndexOf(".");
var quest = mainName.lastIndexOf("?");
var name = mainName.substring(slash+1,dot);
var ext = mainName.substring(dot,mainName.length);
//Remove the _f is it exists
var lang = name.substring(name.length-3,name.length);
//Detect the site sections, get the current site title and the site primary alias strings
var SiteSection = mainName.split("/");
var currentAlias = SiteSection[3];
var currentSite = SiteSection[2];
//Split the url from Site to the end Alias section
var siteSectionAlias = "http://" + currentSite + "/" + currentAlias + "/";
var SectionaAlias = mainName.split(siteSectionAlias)
var htmlFullDocFilename = SectionaAlias[1];
//Extract the filename without the extension
var shtmlLastPos = htmlFullDocFilename.lastIndexOf(".shtml");
var docTitle = htmlFullDocFilename.substring(0,shtmlLastPos-4);
//Alias Toggles, when an alias is detected in the conditional list, switch to the other.
langToggle();
// Main Page
if (lang != "eng") {
window.open("http://" + currentSite + "/" + currentAlias + "/" + docTitle + "-eng" + ext, "_self");
} else {
window.open("http://" + currentSite + "/" + currentAlias + "/" + docTitle + "-fra" + ext, "_self");
}
}
function in langDB.js:
function langToggle() {
switch(currentAlias) {
//Switch the variable from English to French and vice versa depending on the current page's URL string when the toggle js link is clicked
//If ENGLISH switch the variable to French
case "about-us":
currentAlias = "a-notre-sujet"; break;
//If FRENCH switch the variable to French
case "a-notre-sujet":
currentAlias = "about-us"; break;
/* -------------------------------------[ See the first two comments ]---------------------------------- */
case "facilities-and-security":
currentAlias = "installations-et-securite"; break;
case "installations-et-securite":
currentAlias = "facilities-and-security"; break;
/* -------------------------------------[ See the first two comments ]---------------------------------- */
case "offenders":
currentAlias = "delinquants"; break;
case "delinquants":
currentAlias = "offenders"; break;
/* -------------------------------------[ See the first two comments ]---------------------------------- */
case "you-and-csc":
currentAlias = "scc-et-vous"; break;
case "scc-et-vous":
currentAlias = "you-and-csc"; break;
/* -------------------------------------[ See the first two comments ]---------------------------------- */
case "connecting":
currentAlias = "etablir-des-liens"; break;
case "etablir-des-liens":
currentAlias = "connecting"; break;
/* -------------------------------------[ See the first two comments ]---------------------------------- */
case "resources":
currentAlias = "ressources"; break;
case "ressources":
currentAlias = "resources"; break;
/* -------------------------------------[ See the first two comments ]---------------------------------- */
case "international-transfers":
currentAlias = "transferements-internationaux"; break;
case "transferements-internationaux":
currentAlias = "international-transfers"; break;
/* -------------------------------------[ See the first two comments ]---------------------------------- */
case "educational-resources":
currentAlias = "ressources-pedagogiques"; break;
case "ressources-pedagogiques":
currentAlias = "educational-resources"; break;
/* -------------------------------------[ See the first two comments ]---------------------------------- */
case "cfp":
currentAlias = "pfc"; break;
case "pfc":
currentAlias = "cfp"; break;
}
}
when ever I’ll click the language toggle link IE will give me an error that “currentAlias” is undefined, basically the value of the variable doesn’t seem to load into the function called from an external script…
I’m not quite sure what I’m doing wrong…
That’s because
currentAliasis a local variable within thejs_changeitfunction.langTogglecan’t access local variables withinjs_changeit.If your code really needs access to it, and these really have to be separate files, you’ll have to havejs_changeitput it in the global namespace (a property onwindow):…and then use it from there. And you’ll need to be sure that
js_changeitruns beforelangToggleso the code putting it onwindowruns.(I’m saying “global variable” and “property on
window” interchangeably because all global variables are properties on the single [unnamed] JavaScript global object, and on browsers that object is accessible from the global variablewindow[windowis a property pointing back to the object it’s a property of].)But if
langToggleneeds access to it, some refactoring may be appropriate, not least so you can avoid adding even more global symbols.Sorry, just looked again at your code and saw that
js_changeitcallslangToggle. So the much, much better solution is forjs_changeitto passcurrentAliasintolangToggleas an argument. No need for a global variable.So change this line in
js_changeit:to:
And change
langToggleso it acceptscurrentAliasas an argument and returns the updated value for it.The bit where you’re going astray is that a function doesn’t inherit variables from the scope where it’s called, it inherits them from the scope where it’s defined. So
currentAliasdoesn’t exist forlangTogglebecause it’s not declared in the scope wherelangToggleis declared.Let’s take a simpler example:
baris called fromfoo, but doesn’t inheritfoo‘s variables. Iffoowants to communicate something tobar, it would usually pass it in as an argument:So then, if we call
foo,barwill log “42”.Similarly if
barneeds to communicate something back tofoo, it will normally do that by returning a value:Now if we call
foo,barwill log “42” andfoowill log “84”.There are other ways for
fooandbarto share information (object properties, closures), but if you’re new to this stuff that’s plenty to be getting on with for now. 🙂