从外部文件调用外部JS函数

时间:2012-11-02 18:29:05

标签: javascript function

好的,情况就是这样。

我有一个嵌入页面的语言切换链接,它将URL的字符串从-eng.shtml更改为-fra.shtml以及Alias值。

现在基本上在标题中我调用了两个脚本:

<script type="text/javascript" src="/js/langDB.js"></script>
<script type="text/javascript" src="/js/langToggle.js"></script>

LangToggle.js在langDB.js中有一个函数但是当调用编程到langDB.js中的函数时,它并没有像预期的那样工作,它的功能应该是从一个改变变量值到另一个。

切换代码:

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");
        }
    }
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;
    }
}

当我点击语言切换链接IE时会给我一个错误,即#34; currentAlias&#34;未定义,基本上变量的值似乎不会加载到从外部脚本调用的函数中...

我不太确定我做错了什么......

2 个答案:

答案 0 :(得分:4)

  

什么时候我会点击语言切换链接IE会给我一个“currentAlias”未定义的错误......

这是因为currentAliasjs_changeit函数中的局部变量langToggle无法访问js_changeit中的本地变量。

如果您的代码确实需要访问它,并且这些文件必须是单独的文件,您必须将js_changeit放在全局命名空间中(window上的属性):

window.currentAlias = currentAlias;

...然后从那里使用它。您需要确保js_changeitlangToggle之前运行,以便将代码放在window上运行。

(我说的是“全局变量”和“window上的属性”可互换,因为所有全局变量都是单个[未命名] JavaScript全局对象的属性,并且在浏览器上可以从全局变量访问对象window [window是指向对象的属性,它是属性的对象。)

但是如果langToggle需要访问它,那么一些重构可能是合适的,尤其是你可以避免添加更多的全局符号。

很抱歉,只需再次查看您的代码,看到js_changeit 调用 langToggle。因此,js_changeitcurrentAlias作为参数传递给langToggle,这是一个更好,更好的解决方案。不需要全局变量。

因此,请在js_changeit中更改此行:

langToggle();

为:

currentAlias = langToggle(currentAlias);

并更改langToggle,使其接受currentAlias作为参数,并返回更新后的值。

你误入歧途的地方是一个函数不会从 的范围继承变量,它会从定义的范围继承它们 。因此currentAlias不存在langToggle,因为它未在声明langToggle的范围内声明。

让我们举一个更简单的例子:

function foo() {
    var answer = 42;

    bar();
}

function bar() {
    console.log(answer); // <== Error, `answer` is not defined
}
来自bar

foo 被称为,但不会继承foo的变量。如果foo想要与bar进行通信,则通常会将其作为参数传递:

function foo() {
    var answer = 42;

    bar(answer);
}

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

然后,如果我们致电foobar将记录“42”。

同样,如果bar需要将某些内容传达回foo,通常会通过返回值来执行此操作:

function foo() {
    var answer = 42;
    var b;

    b = bar(answer);
    console.log(b);
}

function bar(a) {
    console.log(a);
    return a * 2;
}

现在,如果我们拨打foobar将记录“42”,foo将记录“84”。

foobar还有其他方式可以共享信息(对象属性,闭包),但如果您对这些东西不熟悉,那么现在就可以继续使用。 : - )

答案 1 :(得分:0)

那么,您应该完全按原样获取错误消息。如果你看一下你的langToggle函数,你会立即尝试引用currentAlias,但它还没有在函数的范围内定义。

我看到你已经在函数js_changeit的范围内定义了它,但声明只能在该函数的范围内使用,而不是在langToggle函数范围内。