2015-04-14 89 views
0

我正在使用socket.io並編寫一個webRTC應用程序。所以到目前爲止,每個用戶都點擊了按鈕「連接」,並將它們與另一個也點擊了連接的用戶連接起來。現在當用戶通過視頻通話時,連接按鈕被禁用。 現在,一旦有用戶點擊斷開連接,按鈕連接就會再次可用,因此它不再被禁用。 但是如果用戶現在點擊連接,它會通過TWICE功能。它註冊了TWICE,因爲它以某種方式記得用戶點擊過一次連接。但我認爲,既然它已經註冊了一次,它應該沒問題,並且再次註冊一次。但不是! 所以在這一點上沒有任何作用。一旦用戶點擊斷開連接,然後重新連接,然後連接寄存器三次。等等。 (我在Chrome中使用調試器,我可以看到它通過中斷點的次數)。addEventListener「記得」該人員多次點擊該按鈕,然後在註冊一次後註冊TWICE!怎麼修?

如何使addeventlistener函數不記得所有以前的點擊? (流媒體流)

function justdoit(stream) 
{ 
document.getElementById("connect").addEventListener("click", function(e) 
    { 
     document.getElementById("disconnect").disabled = false; 
     document.getElementById("connect").disabled = true; 

     socket.on("quit", function(quit) 
     { 
      justdoit(stream); 
     });   


     document.getElementById("disconnect").addEventListener("click", function(e) 
     { 
      justdoit(stream); 
     }); 
    }); 

} 
justdoit(stream); 

我並沒有包括所有的代碼,只是我以爲代碼爲相關的。我顯然已經寫了比這更多的代碼,但我認爲這與我寫的代碼有關。

回答

0

您正在添加事件偵聽器,但您永遠不會刪除它們。不過,這可能是更清潔,以儘量避免你叫justdoit完全的遞歸模式,而是你可以重新因子你這樣的代碼

(function init(stream) { 
    // define functions 
    // var connect = document.getElementById('connect'); // you can cache these 
    function click_connect(e) { 
     document.getElementById('connect').disabled = true; 
     document.getElementById('disconnect').disabled = false; 
     // other connect actions 
    } 
    function click_disconnect(e) { 
     document.getElementById('disconnect').disabled = true; 
     document.getElementById('connect').disabled = false; 
     // other disconnect actions 
    } 
    // set up 
    document.getElementById('connect').addEventListener('click', click_connect); 
    document.getElementById('disconnect').addEventListener('click', click_disconnect); 
}(stream)); 

我離開了你的socket.on("quit", ..,因爲我不知道是否你需要重新註冊這個(即你會做它click_connectclick_disconnect),或者如果你只需要做一次(做在// set up區)


如果你只是想知道如何要刪除事件偵聽器,請使用target.removeEventListener(type, handler_reference),即

var fn = function (e) {}, 
    elem = document.getElementById('foo'); 
elem.addEventListener('click', fn); 
elem.removeEventListener('click', fn); // same handler ref as addEventListener