Utilisation de addEventListener pour ajouter un rappel avec des arguments

Je crée un système de glisser-déposer à l'aide d'un canevas.

canvas.addEventListener('mousedown', function () { window.initialClickX = mouse.x; window.initialClickY = mouse.y; window.initialBallX = ball.x; window.initialBallY = ball.y; canvas.addEventListener('mousemove', onMouseMove, false); }, false); function onMouseMove(){ ball.x = mouse.x + window.initialBallX - window.initialClickX; ball.y = mouse.y + window.initialBallY - window.initialClickY; draw(); } 

Quand je clique, j'ai besoin de mémoriser les valeurs de la position initiale de la souris et de la position initiale de la balle, afin que je puisse trainer correctement la balle.

Le code ci-dessus fonctionne parfaitement, mais je pense qu'il semble dérangeant avec toutes les variables globales. J'aimerais que onMouseMove puisse accepter les paramètres initialClickX, initialClickY, initialBallX et initialBallY. Mais comment puis-je ajouter ces paramètres à la fonction de rappel?

Ou s'il y a une meilleure façon de le faire, faites-le moi savoir, merci.

Essayez d'utiliser une fonction wrapper pour le faire.

 canvas.addEventListener('mousedown', function () { var initialClickX = mouse.x; var initialClickY = mouse.y; var initialBallX = ball.x; var initialBallY = ball.y; canvas.addEventListener('mousemove', function() { onMouseMove(initialClickX, initialClickY, mouse.x, mouse.y, initialBallX, initialBallY) }, false); }, false); function onMouseMove(initialClickX, initialClickY, mouseX, mouseY, initialBallX, initialBallY){ ball.x = mouseX + initialBallX - initialClickX; ball.y = mouseY + initialBallY - initialClickY; draw(); } 

Voici un petit exemple de la façon dont vous pourriez le faire sans utiliser de variables globales:

 function called() { console.log(arguments); } function caller(funx) { funx(); } caller(called.bind(this, 'a', 'b')); 

Fondamentalement, vous définissez sur un ensemble de paramètres prédéfinis, dans ce cas 'a' et 'b' .

Dans votre cas, c'est quelque chose comme:

 canvas.addEventListener('mousedown', function () { canvas.addEventListener('mousemove', onMouseMovebind(this, mouse.x, mouse.y, ball.x, ball.y), false); }, false); 

Utilisez un talon de fonction d'emballage qui définit les paramètres:

 canvas.addEventListener('mousemove', function() {onMouseMove(window.initialBallX, window.initialBallY, window.initialClickX, window.initialClickY); });