2010-12-09 17 views
85

Ich versuche, innerhalb eines Zuhörers Definition ein Ereignis-Listener zu entfernen:JavaScript: Entfernen Sie Ereignis-Listener

canvas.addEventListener('click', function(event) { 
    click++; 
    if(click == 50) { 
     // remove this event listener here! 
    } 
// More code here ... 

Wie könnte ich das tun? this = event ... Vielen Dank.

+6

trivial, aber für die zukünftigen Referenzen 'if (klicken == 50) {' 'sein soll, wenn (klicken === 50)' oder 'if (klicken> = 50)' - sie werden nicht das ändern Ausgabe, aber aus Gründen der Vernunft machen diese Kontrollen mehr Sinn. – rlemon

+0

Gute Frage ... Wie entferne ich es, wenn ich keinen Zugriff auf den Inhalt habe? Ich möchte Popups für Onclick auf Schaltflächen mit Greymonkey für andere Websites entfernen, aber wenn ich die Funktion nicht namentlich nennen kann, scheint ich keine Möglichkeit zu finden, es zu entfernen. – JasonXA

Antwort

-3

dieses

canvas.addEventListener('click', function(event) { 
    click++; 
    if(click == 50) { 
      canvas.removeEventListener('click'); 
    } 
+8

Das ist jQuery ... – Ender

+2

@Ender: Du hast Recht ... Arbeite mit jQuery ausgiebig in diesen Tagen .. Realisierte es nicht :) – Chandu

+0

Passiert uns allen (glaube ich) :) – Ender

4

Versuchen Wenn @ Cybernate-Lösung nicht funktioniert, versuchen in den Abzug aus Brechen seine eigene Funktion, so dass Sie darauf verweisen können.

clickHandler = function(event){ 
    if (click++ == 49) 
    canvas.removeEventListener('click',clickHandler); 
} 
canvas.addEventListener('click',clickHandler); 
+0

Sorry Brad. Versehentlich deine Antwort bearbeitet. Zurückgerollt. – user113716

+0

lol, ich sah und war wie "wtf?". Kein Problem, war eine Codeverbesserung, die explizit Klick erklärte. ;-) –

84

Sie müssen benannte Funktionen verwenden.

Auch die click Variable muss außerhalb des Handlers sein, um zu erhöhen.

var click_count = 0; 

function myClick(event) { 
    click_count++; 
    if(click_count == 50) { 
     // to remove 
     canvas.removeEventListener('click', myClick); 
    } 
} 

// to add 
canvas.addEventListener('click', myClick); 

EDIT: Sie rund um die click_counter Variable wie diese schließen konnte:

var myClick = (function(click_count) { 
    var handler = function(event) { 
     click_count++; 
     if(click_count == 50) { 
      // to remove 
      canvas.removeEventListener('click', handler); 
     } 
    }; 
    return handler; 
})(0); 

// to add 
canvas.addEventListener('click', myClick); 

diese Weise können Sie den Zähler über mehrere Elemente erhöhen können.


Wenn Sie nicht wollen, dass, und wollen jedes einen eigenen Zähler haben, dann dies tun:

var myClick = function(click_count) { 
    var handler = function(event) { 
     click_count++; 
     if(click_count == 50) { 
      // to remove 
      canvas.removeEventListener('click', handler); 
     } 
    }; 
    return handler; 
}; 

// to add 
canvas.addEventListener('click', myClick(0)); 

EDIT:Ich hatte vergessen, den Handler zu nennen zurückgegeben in den letzten zwei Versionen. Fest.

+7

+1 - Ich habe das zu einer Geige gemacht und es hat nicht funktioniert. Aber das war, weil ich fünfzigmal klicken musste. Was für ein Idiot ich bin. Vereinfachtes Beispiel hier: http://jsfiddle.net/karim79/aZNqA/ – karim79

+1

@ karim79: Ich wünschte, ich könnte sagen, dass ich noch nie so etwas getan habe. : o) Danke für die jsFiddle. – user113716

+0

+1 Die dritte Option funktionierte für mich. Zuweisen eines Schlüsselereignisses zu einem Eingabefeld zum Löschen der Validierung. Nice one thanks – Gurnard

1

Ich glaube, Sie müssen möglicherweise die Behandlungsfunktion vor der Zeit definieren, etwa so:

var myHandler = function(event) { 
    click++; 
    if(click == 50) { 
     this.removeEventListener('click', myHandler); 
    } 
} 
canvas.addEventListener('click', myHandler); 

Dies ermöglicht Ihnen, den Handler mit Namen aus sich selbst heraus zu entfernen.

+0

Ich glaube, es ist 'eventListener' nicht Handler. ;-) –

+0

Ja, danke ... verwirrt mich mit meinem var name :( – Ender

64
canvas.addEventListener('click', function(event) { 
     click++; 
     if(click == 50) { 
      this.removeEventListener('click',arguments.callee,false); 
     } 

Sollte es tun.

+12

Das ist cool! Doc auf 'arguments.callee' für interessierte Parteien: https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments/callee – Ender

+45

Beachten Sie, dass dies nicht im strikten ECMAScript5-Modus funktioniert .. – user123444555621

3
element.querySelector('.addDoor').onEvent('click', function (e) { }); 
element.querySelector('.addDoor').removeListeners(); 


HTMLElement.prototype.onEvent = function (eventType, callBack, useCapture) { 
this.addEventListener(eventType, callBack, useCapture); 
if (!this.myListeners) { 
    this.myListeners = []; 
}; 
this.myListeners.push({ eType: eventType, callBack: callBack }); 
return this; 
}; 


HTMLElement.prototype.removeListeners = function() { 
if (this.myListeners) { 
    for (var i = 0; i < this.myListeners.length; i++) { 
     this.removeEventListener(this.myListeners[i].eType, this.myListeners[i].callBack); 
    }; 
    delete this.myListeners; 
}; 
}; 
+0

funktioniert perfekt, aber es ist sehr langsam, ich weiß nicht warum ... – mech

21

Sie könnten eine benannte Funktion Ausdruck (in diesem Fall die Funktion a genannt wird) verwenden, etwa so:

var click = 0; 
canvas.addEventListener('click', function a(event) { 
    click++; 
    if (click >= 50) { 
     // remove event listener `a` 
     canvas.removeEventListener('click', a); 
    } 
    // More code here ... 
} 

Schnell und schmutzig Arbeitsbeispiel: http://jsfiddle.net/WqpfZ/1/.

Weitere Informationen zu benannten Funktionsausdrücken: http://kangax.github.io/nfe/.

+0

Große Lösung danke. – gkiely

3

Wenn jemand jquery verwendet, er kann es tun, wie folgt:

var click_count = 0; 
$("canvas").bind("click", function(event) { 
    //do whatever you want 
    click_count++; 
    if (click_count == 50) { 
     //remove the event 
     $(this).unbind(event); 
    } 
}); 

Hoffnung, dass es jemand helfen kann. Beachten Sie, dass die Antwort von @ user113716 funktioniert gut :)

-1

Versuchen Sie es, es funktionierte für mich.

<button id="btn">Click</button> 
<script> 
console.log(btn) 
let f; 
btn.addEventListener('click', f=function(event) { 
console.log('Click') 
console.log(f) 
this.removeEventListener('click',f) 
console.log('Event removed') 
}) 
</script> 
Verwandte Themen