2012-11-02 144 views
1

好吧,这是情况。从外部文件调用外部JS函数

我有一个嵌入到页面的语言切换链接,它将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” 是不确定的,基本上这个变量的值似乎没有加载到从外部脚本调用的函数中...

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

+0

它在哪一行上给出错误? –

+0

我可能会建议一些阅读:http://www.codeproject.com/Articles/182416/A-Collection-of-JavaScript-Gotchas - 请参阅范围部分:)您在该功能中有很多本地范围的变量似乎对你没什么作用,可能更适合作为“对象属性” –

回答

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共享信息(对象的属性,闭包),但如果你是新来这个东西,很多工作与现在越来越上。 :-)

+0

对不起,我对编码很陌生。 我应该在哪里输入window.currentAlias = currentAlias; ?? – EricSP

+0

@ user1795138:其实,我只是注意到了一些东西并更新了答案。不需要全局变量,请参阅更新。 –

+0

好吧所以改变了你提到的代码: currentAlias = langToggle(currentAlias); 和langToggle。js我改变了函数langToggle(){ 功能langToggle(currentAlias){ 现在如果我点击切换它会改变网址tö“undefine”中的别名,如http:// internet/undefined/index-fra .shtml而不是http://internet/a-notre-sujet/index-fra.shtml – EricSP

0

那么,你应该完全按照原来的错误信息。如果你看看你的langToggle函数,你立即尝试引用currentAlias,但是它还没有在函数的范围中定义。

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