好的,情况就是这样。
我有一个嵌入页面的语言切换链接,它将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;未定义,基本上变量的值似乎不会加载到从外部脚本调用的函数中...
我不太确定我做错了什么......
答案 0 :(得分:4)
什么时候我会点击语言切换链接IE会给我一个“currentAlias”未定义的错误......
这是因为currentAlias
是js_changeit
函数中的局部变量。 langToggle
无法访问js_changeit
中的本地变量。
如果您的代码确实需要访问它,并且这些文件必须是单独的文件,您必须将 js_changeit
放在全局命名空间中(window
上的属性):
window.currentAlias = currentAlias;
...然后从那里使用它。您需要确保js_changeit
在langToggle
之前运行,以便将代码放在window
上运行。
(我说的是“全局变量”和“window
上的属性”可互换,因为所有全局变量都是单个[未命名] JavaScript全局对象的属性,并且在浏览器上可以从全局变量访问对象window
[window
是指向对象的属性,它是属性的对象。)
但是如果 langToggle
需要访问它,那么一些重构可能是合适的,尤其是你可以避免添加更多的全局符号。
很抱歉,只需再次查看您的代码,看到js_changeit
调用 langToggle
。因此,js_changeit
将currentAlias
作为参数传递给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
}
然后,如果我们致电foo
,bar
将记录“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;
}
现在,如果我们拨打foo
,bar
将记录“42”,foo
将记录“84”。
foo
和bar
还有其他方式可以共享信息(对象属性,闭包),但如果您对这些东西不熟悉,那么现在就可以继续使用。 : - )
答案 1 :(得分:0)
那么,您应该完全按原样获取错误消息。如果你看一下你的langToggle函数,你会立即尝试引用currentAlias,但它还没有在函数的范围内定义。
我看到你已经在函数js_changeit的范围内定义了它,但声明只能在该函数的范围内使用,而不是在langToggle函数范围内。