2017-12-31 172 views
1

をリフレッシュしてください。ページ内の文字列を探すこのユーザースクリプトがありました。見つからない場合は、4秒後にページをリフレッシュします。アレイ内のアイテムがページ内に存在するかどうかを確認します。もしそうなら、警告してください。そうでなければ、ページ

var item = 'apple'; 
if(document.body.innerHTML.toString().indexOf(item) > -1){ 
    setTimeout(function() { 
     alert(item + " was found"); 
    }, 150); 
}else{ 
    setTimeout(function() 
       { 
     location.reload(true); 
    }, 4000); 
} 

このコードは完全に動作しています。しかし、その後、私は配列で、1つの以上のアイテムを検索したい:

var item = [ 
    'apple', 
    'peach' 
]; 
for (var i = 0; i < item.length; i++){ 
    if(document.body.innerHTML.toString().indexOf(item[i]) > -1){ 
     player.play(); 
     setTimeout(function() { 
      var curitem = item[i]; 
      alert(item[i] + " was found"); 
     }, 200); 
    } 
} 
//else{ 
// setTimeout(function() 
//    { 
//  location.reload(true); 
// }, 4000); 
//} 

しかし、私はこだわっています、私は知らない。

  1. をその配列の項目を警告する方法発見された?今のところ、「未定義が見つかりました」という警告が表示されます。
    これは、スクリプトが機能していることを意味し、配列内の項目を検索しています。しかし、アラートでは「未定義」と表示されます。
  2. 何も見つからなかった場合、ページを更新するにはどうすればよいですか?
+0

"var curitem = item [i]"をsetTimeout呼び出しの上に移動し、 "alert(curitem +"が見つかりました); "を使用してください。代わりに、 "i"は範囲外です。 – arieljuod

+0

@ダニエル、[そのようなゴールポストを動かす](https://meta.stackoverflow.com/questions/258206/what-is-a-help-vampire)は許可されていません。あなたの新しい問題は簡単ですが、彼らも*新しい*です。 ***の後に***の新しい質問をしてください*** *ここの*元の質問は解決されています - それは以下の答えと思われます。 –

+0

@BrockAdams私はこれまでにこれを行うことができました。問題は新しいソリューションが提供されています:/それで、わかりませんでした。 –

答えて

1

これは、配列内で最初に検出されます。ここではDivのID contentが使用されています。これは、スクリプトがサンプルスニペットの本文の一部であるためです。

var item = [ 
 
    'apple', 
 
    'peach' 
 
]; 
 

 
//make sure that items dont contain special regex chars 
 
var itemRe = new RegExp(item.join("|")); 
 
var result = document.getElementById("content").innerHTML.toString().match(itemRe); 
 

 
if (result) { 
 
    //player.play(); 
 
    setTimeout(function() { 
 
    alert(result.toString() + " was found"); 
 
    }, 200); 
 
} else { 
 
    setTimeout(function() { 
 
    location.reload(true); 
 
    }, 4000); 
 
}
<div id="content">gfg</div>

2

これを行うには、いくつかの方法があります。私は正規表現を好んでいます。なぜなら、それはより大きなパワーを提供し、多くの用語に対してループよりも一般に速いからです。

コードのような:

var items = [ 
 
    'apple', 
 
    'peach' 
 
]; 
 
var itmRegEx = new RegExp (`(${ items.join("|") })`); 
 

 
var itmMtch = document.body.innerHTML.match (itmRegEx); 
 
if (itmMtch && itmMtch.length) { 
 
    //player.play(); 
 
    //setTimeout (alert, 200, itmMtch[1] + " was found"); 
 
    setTimeout (console.log, 200, itmMtch[1] + " was found"); 
 
} 
 
else { 
 
    console.log ("Reloading..."); 
 
    //setTimeout (() => {location.reload (true);}, 4000); 
 
}

注:

  1. toString()不要です。
  2. これは、正規表現のフルパワーを可能にします。例えば、'apple\\b'のような式は "apple"と一致しますが、 "apples"は一致しません。
  3. 注意:innerHTMLを使用してください。これは
    <a href="virusserver.net/badapple">free!</a>のようなものと一致します。
    ページ上で目に見えるものが表示される場合は、textContentを代わりに使用してください。
  4. setTimeout()の現代的な形式に注意してください。
  5. document.bodyは、広い、遅い、ネットをキャストします。可能であれば、興味のあるノードをクラスまたはIDでターゲット設定します。
  6. location.reloadは、パラメータ化されたバージョンsetTimeout()が機能しない特殊なケースです。
+0

返信いただきありがとうございます、私は現在の問題で私のポストを更新しました。 –

関連する問題