2015-07-13 61 views
1

我使用hack.chat有點,我看到他們有一個機器人,但機器人程序不適合我,所以我決定讓我自己的。我怎麼去使用window.find()激活該文本只有一次

var finderBinder; 
var searchFor = function(command){ 
    finderBinder = window.find(command, true, true); 
    if(finderBinder){ 
     if(command === "/hello"){ 
      ws.send(JSON.stringify({cmd: "chat", text: "hello!"})); 
     } 
     else if(command === "/cry"){ 
      ws.send(JSON.stringify({cmd: "chat", text: "wah waha wahhh"})); 
     } 
     else 
     { 
      console.log("it was found but it was not a command.") 
     } 
    } 
    else 
    { 
     console.log("Did not find the command"); 
    } 
} 

var loopdeloop = 0; 

while(loopdeloop === 0){ 
    searchFor("/hello"); 
    searchFor("/cry"); 
} 

現在,第一部分作品,如果我只是在網頁上運行的本身,並輸入searchFor(「/你好」);但如果我希望它只是在消息彈出時自動執行該操作,我會嘗試循環(在空閒的聊天室中,因此它不會將已用過的房間發送給垃圾郵件),並且會使瀏覽器崩潰。我知道它爲什麼這樣做。因爲它只是永遠檢查,它永遠看到它,所以它一直試圖做代碼永遠..

但是我將如何使它只運行searchFor當一個新的文本顯示,所以它會運行文本它,如果它是一個命令,它會執行命令?還是有更好的方法來做到這一點?

回答

2

阻止你的函數循環到無窮大(最後)的最簡單方法是每X秒/分鐘/小時/光年調用一次。

使用setInterval(searchFor, 1000);其中第二個參數是以毫秒爲單位的時間間隔。

要將參數傳遞給您的searchFor函數,您必須創建一個匿名函數,以便它不會馬上被調用。

setInterval(function() { searchFor ("/hello"); }, 1000); 

這將每1秒調用一次你的函數,但請記住JavaScript會有一些開銷,並且會有一些延遲。也要小心頻繁地循環你的函數,因爲它會很昂貴,並且瀏覽器有一個內置的延遲,例如,你將不能將setInterval設置爲2毫秒,並且它通常可以跨瀏覽器正常工作。

編輯:將事件綁定到文本框中的更優雅的解決方案也是可能的,這取決於頁面的設置和訪問方式,如果沒有已知的結構,很難回答。

+1

我也支持setInterval JavaScript函數。請注意,您可以爲其設置最大循環次數,併爲其正式停止使用clearInterval()創建一個假條件。 –

+0

這肯定會阻止它永遠循環,但是如何讓它只在文本上運行一次,並且它似乎在運行時選擇文本,然後它不會在其他任何文件上運行。我希望它在屏幕上出現/ hello時運行,但只有一次。但如果有人再次輸入,它會出現。 –

+0

您可以將您的功能綁定到元素上的事件。 'object.addEventListener(「change」,myScript);'來自[w3schools](http://www.w3schools.com/jsref/event_onchange.asp)。訪問包含整個聊天室全部文本的元素,並在其更改時觸發。 –