12
votes

Erreur de plage maximale en cas d'événement de clic dans jQuery

J'ai une erreur reproductible ici, où j'exécute dans un Company RangeError: la taille maximale de la pile d'appels dépassée

C'est juste un événement de clic que j'appelle sur un lien.

mon HTML: xxx

mon javascript: xxx

maintenant, en cliquant sur le #box conduit à une erreur.

http://jsfiddle.net/dmamv/2/


0 commentaires

3 Réponses :


16
votes

Vous devriez arrêter la propagation avec stopimmediatepropagation (), sinon vous avez trop de rcucursion < Pré> xxx

violon http://jsfiddle.net/dmamv/8/4/


1 commentaires

Merci beaucoup pour cela ... ça me conduisait fou :)



9
votes

C'est parce qu'il déclenche de manière récursive l'événement de clic. Ceci est causé par deux problèmes.

Le premier est cette ligne d'apparence innocente: xxx

qui réduit essentiellement à $ (ceci) .click () (parce que le opérateur de virgule évalue les opérandes et renvoie le second) et donc votre événement de clic sur #Container se déclenche. Considérez les exemples suivants - http://jsfiddle.net/2vnbg/ et http://jsfiddle.net/2vnbg/1/ - Notez comment le parent div est ciblé lorsque le $ est manquant.

Préparez la ligne avec le manquant pour résoudre ce problème, c'est-à-dire $ ("A", $ (this)). Cliquez sur (); Le problème suivant est qu'un événement de clic sur l'ancrage bulle jusqu'à l'objet parent (dans votre cas, #Container ). Si le parent a une fonction lié à l'événement de clic qui déclenche un nouvel événement, le cycle va répéter infiniment.

Pour résoudre ce problème, utilisez event.stoppropagation () pour arrêter l'événement de bullementer l'arbre DOM.

Voici un exemple avec les correctifs ci-dessus en place: http://jsfiddle.net/dmamv/9/


0 commentaires

3
votes

Le mien était un élément de liste dans une liste déroulante, donc je voulais que l'événement continue de bouder afin que la liste déroulante soit fermée. C'est la solution que j'ai utilisée: xxx


0 commentaires