0

我正在为历史课制作一个模拟审查谷歌。应该发生的是用户输入一个术语,脚本将检查它是“被阻止”的术语还是可搜索的术语。如果该词被阻止,它将指向另一个页面,如果它是可搜索的,它将指向实际页面。但是,使用我的代码,脚本没有选择被阻止的术语。有任何想法吗?

Javascript:

function searchCensor() 
{
    var keyTerms = document.getElementById("search").value; 
    var blockedTerms = new Array("censorship", "democracy");
    var counter, blocked;
    for(counter = 0; counter < blockedTerms.length; counter++) {
        if(keyTerms == blockedTerms[counter])
            blocked = 1;
        else
            blocked = 0;   
}
    switch(blocked)
    {
    case 1: window.location = "http://andrewgu12.kodingen.com/history/censor.php";
    case 0: window.location = "https://www.google.com/search?q="+keyTerms;
    }   
}

网站:http ://andrewgu12.kodingen.com/history/

谢谢!

4

5 回答 5

2

仔细考虑你的循环:

for(counter = 0; counter < blockedTerms.length; counter++) {
    if(keyTerms == blockedTerms[counter])
        blocked = 1;
    else
        blocked = 0;
}

如果搜索词是“censorship”,那么第一次循环会设置blocked为1。但是第二次循环,它会查看“censorship”并检查它是否与“民主”,然后将blocked设置为0. 如果最后一个被阻止的词与查询匹配,这实际上将阻塞设置为 1。

如果任何被阻止的术语与查询匹配,您真正想要的是设置为 1:

var blocked = 0;
for (var counter = 0; counter < blockedTerms.length; counter++) {
    if(keyTerms == blockedTerms[counter]) {
        blocked = 1;
        break;    // Don't need to continue checking, we know it's blocked
    }
}

请注意,一般来说,如果您使用trueandfalse来表示这种标志,而不是数字(如果阻塞 = 3 意味着什么?什么都没有),它会更有意义(因此更容易阅读)。代码将变为:

var blocked = false;
for (var counter = 0; counter < blockedTerms.length; counter++) {
    if(keyTerms == blockedTerms[counter]) {
        blocked = true;
        break;    // Don't need to continue checking, we know it's blocked
    }
}

if (blocked) {
    // ...
}
else {
    // ...
}

最后,如果您打算在由多个单词组成的查询中提取被审查的术语,您可以通过拆分搜索查询然后检查是否有任何这些术语被阻止(使用嵌套循环)来实现。或者,您可以使用正则表达式并完全消除循环:

var blocked =
    new RegExp('\\b' + blockedTerms.join('\\b|\\b') + '\\b', 'i')
    .test(keyTerms);
于 2012-04-26T19:29:43.490 回答
1

这仅在您的最后一个被阻止的术语匹配时才有效。

您需要修改 for 循环以在找到匹配项时中断:

for(counter = 0; counter < blockedTerms.length; counter++) {
    if(keyTerms == blockedTerms[counter])
    {
        blocked = 1;
        break;
    }
    else
        blocked = 0;   
}
于 2012-04-26T19:29:16.470 回答
0

试试这个 :

你应该:如果你发现障碍就停下来,或者只是举起一面旗帜,再也不碰它(就像你一样)

起初我假设:阻塞=0;//未阻塞

如果循环发现它被阻塞 - 所以阻塞得到'1'。并保持“1”。

function searchCensor() 
{
    var keyTerms = document.getElementById("search").value; 
    var blockedTerms = new Array("censorship", "democracy");
    var counter, blocked=0;
    for(counter = 0; counter < blockedTerms.length; counter++) {
        if(keyTerms == blockedTerms[counter])
            blocked = 1;

}
    switch(blocked)
    {
    case 1: window.location = "http://andrewgu12.kodingen.com/history/censor.php";
    case 0: window.location = "https://www.google.com/search?q="+keyTerms;
    }   
}
于 2012-04-26T19:29:06.483 回答
0

这看起来像是一个开关失败的案例。您的 switch 语句应如下所示(注意中断):

switch(blocked)
    {
    case 1: window.location = "http://andrewgu12.kodingen.com/history/censor.php"; break;
    case 0: window.location = "https://www.google.com/search?q="+keyTerms;
    }   

此外,如上所述,循环逻辑很奇怪。

于 2012-04-26T19:31:17.927 回答
0

问题是,即使您设法检测到正确的条件,由于您没有中断您的 switch 语句,这两种情况都会运行,您将被重定向到 window.location 的最后一个设置。

奇怪的是,window.location 不是即时的。你可以在这个小提琴中看到这个:

http://jsfiddle.net/BFmLU/

于 2012-04-26T19:31:42.747 回答