简体   繁体   中英

calling an external JS function from an external file

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...

when ever I'll click the language toggle link IE will give me an error that "currentAlias" is undefined...

That's because currentAlias is a local variable within the js_changeit function. langToggle can't access local variables within js_changeit .

If your code really needs access to it, and these really have to be separate files, you'll have to have js_changeit put it in the global namespace (a property on window ):

 window.currentAlias = currentAlias; 

...and then use it from there. And you'll need to be sure that js_changeit runs before langToggle so the code putting it on window runs.

(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 variable window [ window is a property pointing back to the object it's a property of].)

But if langToggle needs 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_changeit calls langToggle . So the much, much better solution is for js_changeit to pass currentAlias into langToggle as an argument. No need for a global variable.

So change this line in js_changeit :

currentAlias = langToggle(currentAlias);

to:

 currentAlias = langToggle(currentAlias); 

And change langToggle so it accepts currentAlias as 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 currentAlias doesn't exist for langToggle because it's not declared in the scope where langToggle is declared.

Let's take a simpler example:

function foo() {
    var answer = 42;

    bar(answer);
}

function bar(a) {
    console.log(a); // This is fine
}

bar is called from foo , but doesn't inherit foo 's variables. If foo wants to communicate something to bar , it would usually pass it in as an argument:

 function foo() { var answer = 42; bar(answer); } function bar(a) { console.log(a); // This is fine } 

So then, if we call foo , bar will log "42".

Similarly if bar needs to communicate something back to foo , it will normally do that by returning a value:

 function foo() { var answer = 42; var b; b = bar(answer); console.log(b); } function bar(a) { console.log(a); return a * 2; } 

Now if we call foo , bar will log "42" and foo will log "84".

There are other ways for foo and bar to share information (object properties, closures), but if you're new to this stuff that's plenty to be getting on with for now. :-)

Well, you should take the error message exactly as it is. If you look at your langToggle function, you immediately try to reference currentAlias, but it has not been defined yet in the function's scope.

I see you have defined it in the scope of function js_changeit, but the declaration would only be available in the scope of that function not in the langToggle function scope.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM