2010-12-09 13 views
85

Estoy intentando quitar un detector de eventos en el interior de una definición oyente:JavaScript: eliminar detector de eventos

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

¿Cómo podría hacer eso? this = event ... Gracias.

+6

trivial, pero para las futuras referencias si '(click == 50) {' 'si debería haber (clic === 50)' ', o si (haga clic en> = 50)' - no van a cambiar la salida, pero por razones de cordura estas verificaciones tienen más sentido. – rlemon

+0

Una buena pregunta ... ¿cómo la elimino si no tengo acceso al contenido? Quiero eliminar las ventanas emergentes de los botones onclick on que usan greasemonkey para otros sitios, pero a menos que pueda hacer referencia a la función por nombre, no parece encontrar una manera de eliminarla. – JasonXA

Respuesta

-3

probar este

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

Eso es jQuery ... – Ender

+2

@Ender: Tiene usted razón ... Estoy trabajando con jQuery extensamente en estos días ... No me di cuenta :) – Chandu

+0

Nos sucede a todos nosotros (creo) :) – Ender

4

Si @ solución de Cybernate no funciona, trate de romper el gatillo fuera a su propia función de lo que puede hacer referencia a ella.

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

Lo siento Brad. Accidentalmente editó su respuesta. Retrotraído. – user113716

+0

lol, miré y era como "wtf?". No hay problema, fue una mejora en el código, declarando explícitamente clic. ;-) –

84

Es necesario utilizar funciones con nombre.

Además, la variable click debe estar fuera del controlador para aumentar.

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: Se podría cerrarse alrededor de la variable click_counter así:

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); 

esta manera se puede incrementar el contador a través de varios elementos.


Si usted no quiere eso, y desea que cada uno tenga su propio contador, a continuación, hacer esto:

EDITAR
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)); 

: siendo devueltosme había olvidado de nombrar el manejador en las últimas dos versiones. Fijo.

+7

+1 - Hice esto en un violín y no funcionó. Pero eso fue porque necesitaba hacer clic cincuenta veces :) Qué idiota soy. Simplificado ejemplo aquí: http://jsfiddle.net/karim79/aZNqA/ – karim79

+1

@ karim79: Me gustaría poder decir que nunca he hecho algo así antes. : o) Gracias por el jsFiddle. – user113716

+0

+1 La tercera opción funcionó para mí. Asignación de un evento clave a un campo de entrada para borrar la validación. Uno de los buenos gracias – Gurnard

1

creo que es posible que necesite definir la función de controlador antes de tiempo, así:

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

Esto le permitirá quitar el manejador por el nombre desde dentro de sí mismo.

+0

creo que es 'eventListener' no manejador. ;-) –

+0

Sí, gracias ... yo confundido con mi nombre var :( – Ender

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

Debería hacerlo.

+12

Esto es genial Doc en 'arguments.callee' para las partes interesadas: https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/argumentos/destinatario de la llamada – Ender

+45

Tenga en cuenta que esto no funcionará en modo estricto ECMAScript5 – 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

. funciona perfectamente, pero es muy lento, no sé por qué ... – mech

21

se puede utilizar una expresión de la función llamada (en este caso la función se llama a), así:

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

rápida y sucia ejemplo de trabajo: http://jsfiddle.net/WqpfZ/1/.

Más información sobre las expresiones de funciones nombradas: http://kangax.github.io/nfe/.

+0

Gran solución gracias. – gkiely

3

Si alguien usa jQuery, él puede hacerlo de esta manera:

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); 
    } 
}); 

esperanza de que pueda ayudar a alguien. Tenga en cuenta que la respuesta dada por @ user113716 trabajo :) muy bien

-1

Prueba esto, que trabajó para mí.

<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> 
Cuestiones relacionadas