2017-06-12 6 views
0

Ich möchte nur ein Mausereignis "hören", wenn ein Kontrollkästchen angeklickt wird. Deshalb habe ich den folgenden Code:Hören Sie eine Mausereignis unter Bedingung

HTML

<input type="checkbox" id="magicLens" onchange="magicLens()"> 
<label for="magicLens">Magic Lens</label> 

JS

function magicLens(){ 
    const magicLens_checked = document.getElementById('magicLens').checked; 

    if (magicLens_checked === true){ 
     canvas.addEventListener('mousemove', e => { 
     myAnonymous = arguments.callee; 
     ... 
     // draw something at the current mouse position 
     // and therefore use the 'e' event object 
    }); 
    } 
    else { 
     canvas.removeEventListener('mousemove', myAnonymous); 
    } 
} 

Problem ist, dass die Zeichnung (eine Linse) tritt auch auf, wenn das Kontrollkästchen nicht aktiviert ist (false). Ich bin mir nicht einmal sicher, ob removeEventListener() der richtige Weg ist, um damit umzugehen (obwohl ich die ganze Sache schon ohne es ausprobiert habe und das Ergebnis das gleiche war).

Vielleicht haben Sie eine bessere Idee, das Problem im Titel zu beschreiben. Fühlen Sie sich frei zu bearbeiten!

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee – Teemu

+0

was ist mit dem Hinzufügen von Mousemove-Listener beim Start und im Inneren überprüfen, ob MagicLens aktiviert ist und sich entscheiden zu zeichnen oder nicht? – ReadyFreddy

+0

Die Verwendung von 'arguments.callee' ist eine schlechte Vorgehensweise. Versuchen Sie stattdessen, eine benannte Funktion zu verwenden. – vassiliskrikonis

Antwort

0

Es ist einfacher, tatsächlich immer auf das Ereignis zu hören und dort zu überprüfen, ob das Kontrollkästchen aktiviert ist.

const canvas = document.getElementById('canvas'); 

canvas.addEventListener('mousemove', e => { 
    const magicLens_checked = document.getElementById('magicLens').checked; 

    if (!magicLens_checked) { 
     return; 
    } 

    // Do something with e 
    console.log(e); 
}); 

Sie können es in diesem Fiddle aus. (Ich habe den Ereignis-Listener zum Dokumentieren hinzugefügt, um die Erstellung eines willkürlichen Canvas zu vermeiden.)

+0

Das funktioniert. Vielen Dank! Ist das nicht ein wenig "performance critical", da es immer eine neue Variable erzeugt und eine if-Bedingung prüft, wenn sich der Cursor bewegt (auch wenn ich ihn nicht brauche)? – Muad

+0

Kaum. (Ich hoffe, ich sage nichts falsches, aber ...) In Javascript weisen wir keine Variablen dem Speicher zu, sondern sind Verweise auf Objekte. Diese werden mit dem Schlüsselwort 'new' instanziiert. Bezüglich der if-condition-Prüfung habe ich ein kleines jsperf-Snippet erstellt, um Ihnen zu zeigen, dass es kaum einen Unterschied macht: https://jsperf.com/if-case-in-mouseevent –

+0

Okay, nochmals vielen Dank! Definitiv der einfachste Weg als 'removeEventListener()' ... – Muad

0

Das Javascript-Modul erkennt, was Sie an addEventListener und removeEventListener als zwei verschiedene Funktionen übergeben, weshalb der removeEventListener nicht funktioniert . Erstellen Sie eine benannte Funktion außerhalb dieser und übergeben Sie sie an sie.