2012-04-26 17 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

+0

私はブロックされた条件(「民主主義」と「検閲」)でテストしており、いずれもブロックされていません。 – Andrew

答えて

2

慎重にループを考えてみて:

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

それは、検索語が「検閲」で、それはマッチが見つかったときにあなたは破るためにループのためにあなたを変更する必要が

ループを通る最初の時間は1にブロックされます。しかし、2回目のループでは、 "検閲"を見て "民主主義"と照合し、ブロックを0に設定します。最後にブロックされた用語はクエリに一致します。

任意のブロックされた用語は、クエリに一致する場合は何が本当にしたいことは1にブロックされて設定することです:あなたはtrueを使用する場合、一般的に、それはより意味のある(したがって、読みやすい)だと

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

注意数字の代わりにこの種のフラグの場合は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); 
+0

ありがとう!単なる論理改善の問題のように見える – Andrew

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