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;
}

検索語が「検閲」の場合、最初のループではブロックされた値を 1 に設定します。しかし、2 回目のループでは、「検閲」を調べて「民主主義」と照合し、ブロックされた値を 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一般に、数字の代わりにandをこの種のフラグに使用すると、より意味のある (したがって読みやすくなる) ことに注意してください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);
于 2012-04-26T19:29:43.490 に答える
1

これは、LAST のブロックされた用語が一致した場合にのみ機能します。

一致が見つかったときに中断するように 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 に答える