我正在为历史课制作一个模拟审查制度的谷歌。应该发生的情况是用户输入一个术语,脚本将检查它是“被阻止”的术语还是可搜索的术语。如果该术语被阻止,它将导致不同的页面,如果它是可搜索的,它将导致实际页面。但是,在我的代码中,脚本没有拾取被阻止的术语。有什么想法吗?
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/
谢谢!
最佳答案
仔细考虑你的循环:
for(counter = 0; counter < blockedTerms.length; counter++) {
if(keyTerms == blockedTerms[counter])
blocked = 1;
else
blocked = 0;
}
如果搜索词是“审查制度”,那么第一次循环时会将阻塞设置为 1。但第二次循环时,它将查看“审查制度”并对照“民主”进行检查,然后将阻塞设置为 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
}
}
请注意,一般来说,如果您使用 true
和 false
作为这种标志,而不是数字(什么),它会更有意义(因此更容易阅读)这是否意味着如果被阻止= 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);
关于JavaScript 数组和循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10340013/