2012-04-26 93 views
0

我正在为历史课程进行模拟审查Google。应该发生的事情是用户输入一个术语,脚本将检查它是否是“受阻”术语或可搜索术语。如果该术语被阻止,它将导致不同的页面,并且如果它是可搜索的,则会导致实际的页面。但是,通过我的代码,脚本不会提取被阻止的术语。有任何想法吗?Javascript数组和循环

的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/

谢谢!

+0

您是否收到任何错误?你在测试什么数据? – j08691 2012-04-26 19:28:43

+0

我在封锁条款(“民主”和“审查制度”)进行测试,并没有一个被挑选为“封锁” – Andrew 2012-04-26 19:30:09

回答

2

想想小心你的循环:

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

它的搜索词是“送检”,然后第一次通过循环将阻塞设置为1.但通过循环第二次,它会查看“审查”并检查它反对“民主”,然后将其设置为0.如果上一个被阻止的术语与查询匹配

你真正想要的是设置阻断为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 
    } 
} 

注意,在一般情况下,这是更有意义的(因而更容易阅读)如果你使用truefalse为这种标志,而不是一个数字(这是什么意思,如果阻止= 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); 
+0

谢谢!看起来这只是现在逻辑改进的问题 – Andrew 2012-04-27 04:04:00

0

试试这个:

你应该:或停止,如果你发现块只是提出一个标志和再也不会去碰它(像你一样)

起初我asssume:受阻= 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; 
    } 
} 
1

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

你需要修改你的for循环来打破,当它找到一个匹配:

for(counter = 0; counter < blockedTerms.length; counter++) { 
    if(keyTerms == blockedTerms[counter]) 
    { 
     blocked = 1; 
     break; 
    } 
    else 
     blocked = 0; 
} 
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; 
    } 

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

0

问题是,即使你设法检测到正确的条件,因为你没有打破你的switch语句,这两种情况都会运行,你将被重定向到window.location的最后设置。

奇怪的是,window.location不是即时的。您可以在此小提琴看到自己:

http://jsfiddle.net/BFmLU/