1

好的,情况就是这样。

我在页面中嵌入了一个语言切换链接,它将 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 会给我一个“currentAlias”未定义的错误,基本上变量的值似乎没有加载到从外部脚本调用的函数中......

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

4

2 回答 2

4

当我单击语言切换链接时,IE 会给我一个错误,“currentAlias”未定义...

那是因为currentAlias是函数内的局部变量。无法访问.js_changeitlangTogglejs_changeit

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

window.currentAlias = currentAlias;

...然后从那里使用它。而且您需要确保它js_changeit在运行之前运行,langToggle以便运行它的代码window

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

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

抱歉,刚刚再次查看了您的代码并看到了js_changeit 调用 langToggle。因此,更好的解决方案是作为参数js_changeit传入。不需要全局变量。currentAliaslangToggle

所以改变这一行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闭包),但是如果您对这些东西不熟悉,那么现在就可以开始了。:-)

于 2012-11-02T18:31:31.807 回答
0

好吧,您应该完全按原样接收错误消息。如果您查看您的 langToggle 函数,您会立即尝试引用 currentAlias,但它尚未在函数的范围内定义。

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

于 2012-11-02T18:34:39.927 回答