2016-12-28 10 views
0

私は誰かがのWhatsAppウェブ上にインラインで取得する場合に通知するスクリプトを作成しようとしていると私は、このスクリプトを持っている:繰り返し要素が見つからない場合は機能

function addZero(i) { 
if (i < 10) { 
    i = "0" + i; 
} 
return i; 
} 

function onlineCheck() { 
    var y = document.querySelector('[title="online"]'); 
    var d = new Date(); 
    if (y == null) { 
     // I want it to repeat onlineCheck() after 1 second 
    } else { 
     if (y.innerText === 'online') { 
      new Notification("contact is online"); 
      console.log(d.toLocaleDateString() + "|" + addZero(d.getHours()) 
      + ":" + addZero(d.getMinutes()) + ":" + addZero(d.getSeconds()) 
      + " " + "Notification sent"); 
     } 
    } 
} 

を、私はを交換したい//私は、関数を実行します何かをここに置くかわからないonlineCheck()

私は

私が最初にこのスクリプト持っていたことをやるべきか:

var onlineCheck1 = window.setInterval(function(){ 
    var x = document.querySelector('[title="online"]'); 
    var name = $('#main>header>div.chat-body>div.chat-main>.chat-title>span').text() 
    var d = new Date(); 
    if (x == null) { 
     console.log(d.toLocaleDateString() + "|" + addZero(d.getHours()) 
     + ":" + addZero(d.getMinutes()) + ":" + addZero(d.getSeconds()) 
     + " " + name + " " + "was" + " " + "offline"); 
    } else { 
     if (x.innerText === "online") { 
      console.log(d.toLocaleDateString() + "|" + addZero(d.getHours()) 
      + ":" + addZero(d.getMinutes()) + ":" + addZero(d.getSeconds()) 
      + " " + name + " " + "was" + " " + "////online///"); 
    } else { 
     console.log(d.toLocaleDateString() + "|" + addZero(d.getHours()) 
     + ":" + addZero(d.getMinutes()) + ":" + addZero(d.getSeconds()) 
     + " " + name + " " + "was" + " " + "offline"); 
    } 
} ,1000); 

が、私はそれが私はちょうどそれがタイトル=「オンライン」

注意を持つ要素を見つけるまで、それは自分自身を繰り返したいコンソールのログを持つ事ないしたい:私は実行するために、クロムのコンソールを使用していますがスクリプトとあなたが望むなら、あなたはそれを自分で試すことができます。

+1

関数自体をもう一度呼び出すことができます。 –

+1

関数名で関数を呼び出すだけです。 –

+3

は 'onlineCheck()'を置くだけで、関数自体が再び呼び出されます。これは**再帰**と呼ばれ、Web上でそれに関する多くの良い記事を見つけることができます。ただし、関数を無限に呼び出さないように注意する必要があります。必要条件が満たされたときに呼び出しを禁止する条件が常にあることを確認してください。 – Sergeon

答えて

0

あなたは、単に関数自体を呼び出す

function onlineCheck() { 
    var y = document.querySelector('[title="online"]'); 
    var d = new Date(); 
    if (y == null) { 
     onlineCheck(); 
    } else { 
     if (y.innerText === 'online') { 
     new Notification("contact is online"); 
     console.log(d.toLocaleDateString() + "|" + addZero(d.getHours()) + ":" + addZero(d.getMinutes()) + ":" + addZero(d.getSeconds()) + " " + "Notification sent"); 
    } 
    } 
    } 
+0

何かがうまくいかない場合は、無限ループを避けるために、まだ脱出する方法が必要だと思います。 – Joe

2

以下のように関数を呼び出すことができます。これは、再帰と呼ばれます。あなたは、あなたがrecursion技術を必要とするonlineCheck()呼び出し自体無限

function onlineCheck() 
{ 
    var y = document.querySelector('[title="online"]'); 
    var d = new Date(); 

    if (y == null) 
    { 
     onlineCheck(); 
    } 
    else 
    { 
     if (y.innerText === 'online') 
     { 
      new Notification("contact is online"); 
      console.log(d.toLocaleDateString() + "|" + addZero(d.getHours()) + ":" + addZero(d.getMinutes()) + ":" + addZero(d.getSeconds()) + " " + "Notification sent"); 
     } 
    } 
} 
+0

何かがうまくいかない場合、無限ループを避けるために、まだ逃げ道をする方法が必要だと思います。 – Joe

+0

"*注意する必要があります*"は本当に役に立たない。この関数を直接再帰させると、他のものは同時に実行されずにページが更新され、ページを更新するだけで停止させることができます。 – melpomene

-1

を防ぐために注意しなければなりません。

この技術を使用している間、recursive functionはプロセスを終了するtermination conditionを必要とすべきである(そうでない場合、プロセスは、最終的にMaximum call stack size exceededエラーが発生します繰り返し処理を無限になります)

function onlineCheck() { 
var y = document.querySelector('[title="online"]'); 
var d = new Date(); 
if (y == null) { 
    // Be sure to add a termination condition 
    onlineCheck() 
} else { 
    if (y.innerText === 'online') { 
    new Notification("contact is online"); 
    console.log(d.toLocaleDateString() + "|" + addZero(d.getHours()) + ":" + addZero(d.getMinutes()) + ":" + addZero(d.getSeconds()) + " " + "Notification sent"); 
} 
} 
} 
+1

'y!= null'は終了条件です。 – melpomene

+0

@melpomene終了条件を知っている人は誰ですか? OPはそれについて言及しなかった –

+0

なぜdownvote?もしy!= nullが終了条件であれば、彼は再び関数を呼び出す必要はありません –

-1

他の人が指摘したように、あなただけ呼び出すことができます直接関数:onlineCheck();。ただし、ループ条件(document.querySelector('[title="online"]') != null)は変更しても変更されないため、無限ループ/再帰になります。ここで

は別の方法です:

function onlineCheck() { 
    var y = document.querySelector('[title="online"]'); 
    var d = new Date(); 
    if (y == null) { 
     setTimeout(onlineCheck, 10); 
    } else { 
     if (y.innerText === 'online') { 
      new Notification("contact is online"); 
      console.log(d.toLocaleDateString() + "|" + addZero(d.getHours()) + ":" + addZero(d.getMinutes()) + ":" + addZero(d.getSeconds()) + " " + "Notification sent"); 
     } 
    } 
} 

10ミリ秒後に呼ばれるこの再スケジュールonlineCheck、ページを再度チェックする前に更新するチャンスを与え。たとえば、1000にこの数を増やすことができます。この方法では、毎秒1回回転するのではなく、1秒に1回確認します。 "はまだ完了していますか?今はどうですか?今はどうですか?今は今?今は?"

+0

y!= nullは終了条件です。 –

+0

あなたのソリューションは、何らかの理由で動作していないことを除いて、最高の音が鳴ります。注:私はChromeのコンソールを使用してスクリプトを実行しています。 –

+0

@GangadharJannuそれは私が言ったことです、はい。何を私に伝えようとしていますか? – melpomene

関連する問題