1

さて、ここに状況があります。

ページに言語切り替えリンクが埋め込まれています。これにより、URLの文字列がエイリアス値とともに-eng.shtmlから-fra.shtmlに変更されます。

基本的にヘッダーで、2つのスクリプトを呼び出しています。

<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_changeitであるためです。langToggle内のローカル変数にアクセスできませんjs_changeit

コードが本当にそれにアクセスする必要があり、これらが本当に別のファイルである必要がある場合は、js_changeitそれをグローバル名前空間 (のプロパティwindow)に配置する必要があります。

window.currentAlias = currentAlias;

...そしてそこから使用します。そして、それを置くコードが実行されるように、それjs_changeitが前に実行されることを確認する必要があります。langTogglewindow

(「グローバル変数」と「のプロパティ」を同じ意味で言っているwindowのは、すべてのグローバル変数は単一の [名前のない] JavaScript グローバル オブジェクトのプロパティであり、ブラウザ上ではそのオブジェクトはグローバル変数からアクセスできるためですwindow[windowは、のプロパティであるオブジェクト]。)

ただし、langToggleアクセスする必要がある場合は、いくつかのリファクタリングが適切な場合があります。特に、グローバル シンボルをさらに追加することを避けることができます。

申し訳ありませんが、コードをもう一度見て、 がjs_changeit 呼び出さ langToggleれていることを確認しました。したがって、はるかに優れた解決策は、 forを引数としてjs_changeit渡すことです。グローバル変数は必要ありません。currentAliaslangToggle

したがって、この行を次のように変更しjs_changeitます。

langToggle();

に:

currentAlias = langToggle(currentAlias);

そして、引数としてlangToggle受け入れcurrentAlias、更新された値を返すように変更します。

あなたが迷っているところは、関数が呼び出されたスコープから変数を継承せず、定義されたスコープから変数を継承することです。Soが宣言されているスコープで宣言されていないため、currentAlias存在しません。langTogglelangToggle

もっと簡単な例を見てみましょう:

function foo() {
    var answer = 42;

    bar();
}

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

barから呼び出されますが、の変数fooを継承しません。に何かを伝えたいfoo場合、通常はそれを引数として渡します。foobar

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" がログに記録されます。

foo情報を共有する方法は他にもありますbar(オブジェクトのプロパティ、クロージャ) が、このようなことに慣れていない場合は、今のところ十分に理解できます。:-)

于 2012-11-02T18:31:31.807 に答える
0

エラーメッセージをそのまま受け取る必要があります。langToggle 関数を見ると、すぐに currentAlias を参照しようとしますが、関数のスコープでまだ定義されていません。

関数 js_changeit のスコープで定義したようですが、宣言は langToggle 関数スコープではなく、その関数のスコープでのみ使用できます。

于 2012-11-02T18:34:39.927 に答える