开关盒错误?

Posted

技术标签:

【中文标题】开关盒错误?【英文标题】:Switch case bug? 【发布时间】:2012-11-06 14:01:26 【问题描述】:

所以我得到了这个非常简单的 switch 案例,我从一个局部变量将值导入到函数中,它的主要功能是从法语别名切换到英语别名并将值返回到我的 javascript...

如果由于某种原因页面的别名在这种情况下没有计算出来,它应该转到默认值并触发我的 jsbreak 函数,但在我的情况下,即使检测到别名并将变量切换为新值仍会转到默认并执行代码...

function langToggle(currentAlias) 
    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
        //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;
        default: alert("the no matching alias");
    
    //Return the value of the updated Alias to the language toggle script
    return currentAlias;

这是为那些说它可能被窃听的人调用切换脚本的 OTHER 函数?

function jsabort()
    throw new Error('This is not an error. This is just to abort javascript');
   
function js_changeit() 
    var mainName = String(window.location);
    var dash = mainName.lastIndexOf("-");
    var slash = mainName.lastIndexOf("/");  
    var dot = mainName.lastIndexOf(".");
    var name = mainName.substring(slash+1,dot);
    var ext = mainName.substring(dot,mainName.length);
    var lang = name.substring(name.length-3,name.length);
    var urlSection = mainName.split("/");
    var currentAlias = urlSection[3];
    var currentSite = urlSection[2];
    var urlUntilEndAlias = "http://" + currentSite + "/" + currentAlias + "/";
    var mainUrlSplittedAtAlias = mainName.split(urlUntilEndAlias);
    var mainUrlSplittedAtAliasLastSlash  = mainUrlSplittedAtAlias[1];
    if (mainName === "http://internet/index-eng.shtml" || mainName === "http://internet/index-fra.shtml" ) 
        if (lang != "eng") 
            window.open("http://" + currentSite + "/" + "index" + "-eng" + ext, "_self");
         else if (lang != "fra") 
            window.open("http://" + currentSite + "/" + "index" + "-fra" + ext, "_self");
        
     else 
    var lastDash = mainUrlSplittedAtAliasLastSlash.lastIndexOf("-");
    var subSectionUntilEndFilename = mainUrlSplittedAtAliasLastSlash.substring(0,lastDash);
    var UpdatedAlias = langToggle(currentAlias);
    langToggle();
        if (lang != "eng") 
            window.open("http://" + currentSite + "/" + UpdatedAlias + "/" + subSectionUntilEndFilename + "-eng" + ext, "_self");
         else if (lang != "fra") 
        window.open("http://" + currentSite + "/" + UpdatedAlias + "/" + subSectionUntilEndFilename + "-fra" + ext, "_self");
        
    

【问题讨论】:

@MitchWheat:哈哈——让我开心…… 你为什么要使用switch?用作地图的普通对象只需要不到一半的代码量。 这对我有用。见jsfiddle.net/UAacc 【参考方案1】:

就像在 cmets 中提到的@Jon,你应该使用查找对象来解决这个问题:

var lookup = 
    "about-us":        "a-notre-sujet",
    "a-notre-sujet":   "about-us",
    "offenders":       "delinquants",
    // ...
;

var langToggle = lookup[ currentAlias ];

if(!langToggle) 
    alert("the no matching alias");

【讨论】:

我已经编写 javascript 代码大约 3 天了,感谢您的提示,将尝试。 一般来说,该语句不是那么有用。你能用更准确的方式重新定义吗? 我将该代码复制粘贴到 langDB.js 函数脚本中,当我单击切换按钮时,在包含 about-us 作为 url 字符串中的别名的页面中,它不会加载它。 .. 见上面的代码,我用我的主要功能更新了帖子。 @EricSP:我真的不知道你期望发生什么或应该发生什么。无论如何,langToggle 应该返回一个字符串,您只是立即调用该函数,而无需在任何地方存储或分配其返回值。因此,如果“不起作用”与此有关,那是您的第一个问题。 基本上,我原来的 Switch 案例脚本在主脚本中获取 currentAlias 的值,然后将其引入 LangDB.js,从那里将其“加载”到交换机中,每个案例都评估 currentAlias 的值变量并在检测到时将其设置为与法国值相反的值,然后在最后它返回 currentAlias 的值,当主脚本调用 ToggleAlias() 时,它将新别名加载到主脚本末尾的最终条件中根据 URL 的字符串扩展名,它将替代变量值分配给 UpdatedAlias...【参考方案2】:

我遇到了同样的问题(即使对于这种情况,解决方案不应该使用带字符串的开关,而是使用 jAndy 建议的表格)。

因此,如果没有语法错误或某些未放置的中断,您应该(可以?)执行以下操作:

function langToggle(currentAlias) 
    var myKey = '' + currentAlias;
    switch(myKey) 
       case 'XPTO':
           //do xpto
           break;
       case 'YPTO':
           //do ypto
           break;
    

在我的例子中,我确定我传递的是字符串,所以这不仅仅是将参数转换为字符串,而是创建一个新的字符串对象。这种方式对我有用。我想给出一个更好的解释为什么它有效但我没有它:) 希望这对任何人都有帮助。

如果有人知道更好的理由,请分享!

【讨论】:

更新:不完全确定,但在我的情况下,这可能与 JavaScript 的 (UTF16) 编码有关,我初始化 myKey 变量的步骤可能是修复我从服务器发送的一些奇怪字符我无法在文本编辑器上“看到”。前几天,我将代码与以前的版本进行比较,发现其中一种情况。

以上是关于开关盒错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Pentaho 开关盒在运行后不会损坏?

开关盒需要一点更新

开关盒的样式

如何测试取决于参数的开关盒?

开关盒上的 iOS 单元测试

Thymeleaf 开关盒捕获所有案例