2017-09-05 2 views
0

Bonjour, j'utilise fabricjs, et ça marche bien pour moi. J'ai cependant récemment rencontré une chose JavaScript que je ne peux pas expliquer, et que j'ai seulement détectée sur fabricjs (dans tous les navigateurs). Remarque: J'utilise 1.7.11 de fabricjs.Faux code exécuté dans fabricjs _fireOverOutEvents

Il se produit sur mouse:out événements. Il est seulement effet secondaire est de météorisation la console du navigateur avec:

Uncaught TypeError: Cannot read property 'fire' of null at klass._fireOverOutEvents (fabric.js:9717) ...

Il va comme ceci:

screenshot, falsy yet executed

Ceci est la vanille fabric.js (à savoir mon code). Comme vous pouvez le voir, target est undefined, donc le bloc if n'est pas exécuté. Jusqu'à présent, c'est prévu. Maintenant pour la partie étrange.

this._hoveredTarget est null (voir vue du débogueur ci-dessous). Le bloc else if ne doit pas être exécuté, mais il l'est.

Debugging view of falsy "else if" being executed

J'ai essayé de le fixer avec des variantes comme this._hoveredTarget !== null et this._hoveredTarget != null, mais il va toujours là quand this._hoveredTarget est null.

Je n'avais jamais vu ça auparavant. Une idée?

+0

Pouvez-vous fournir la preuve que 'this._hoveredTarget' est null? – clabe45

+0

vérifiez d'abord si 'this._hoveredTarget = target', après cela si vous exécutez – Durga

+0

J'ai ajouté une vue de débogueur du code lorsque le problème se produit. – RKMNGRT

Répondre

0

Ok, cela ne peut pas arriver juste parce qu'un bogue dans le code. un IF est un IF. Ce qui peut arriver, c'est que vous avez un traitement d'événement sur mouse:out qui se passe avant que cette ligne ne soit en erreur et que le gestionnaire d'événements supprime la référence à this._hoverTarget.

Ceci est toujours un bug à mon avis puisque si le code personnalisé est autorisé, la condition doit être vérifiée à nouveau avant d'accéder à la variable en tant qu'objet.

La version actuelle de fabricJS 1.7.17 a un code différent en place:

enter image description here

this.hoveredTarget est enregistré comme référence immédiatement afin que tout ce qu'il vous arrive hoveredTarget êtes en sécurité.

Vous devriez peut-être mettre à niveau.