2017-01-19 1 views
2

J'ai un petit problème. J'ai créé un élément dans un objet et cela fonctionne bien. Mais maintenant je veux ajouter des EventListeners pour exécuter une fonction interne à mon objet, le problème est que je ne peux pas exécuter la fonction "setSelection". ("ceci" n'est pas le "ceci" de l'objet, mais le "ceci" de l'événement à l'intérieur de la fonction de clic).jQuery a créé l'élément dom et ajouté l'écouteur d'événement

function Object() { 
    this.init = function() { 
     // delete table 
     // ... 
     // set table 
     $('tr').append('<td id="1">test</td>'); 

     $('td').click(function() { 
      // execute setSelection 
     }); 
    } 

    this.setSelection = function(x) { 
     alert('You clicked id ' + x); 
    } 
} 

$(document).ready(function() { 
    x = new Object(); 
    x.init(); 
}); 
+0

cela peut entraîner des problèmes pour surcharger la fonction 'Object', si vous savez ce que vous faites, très bien, ou bien, vous devriez le renommer. Pour votre problème, ce qui provoque cela est que les rappels d'événements sont exécutés dans le contexte global. C'est pourquoi les réponses proposées fonctionnent, vous devez soit stocker le contexte dans un var, ou utiliser des fonctions comme 'bind',' apply' ou tel quel pour récupérer le contexte – Kaddath

Répondre

1

Vous pouvez résoudre ce problème en stockant la référence de this dans le champ extérieur à une variable que vous pouvez utiliser dans le gestionnaire d'événements click:

function Object() { 
    var _this = this; 

    this.init = function() { 
     // delete table 
     // ... 
     // set table 
     $('tr').append('<td id="1">test</td>'); 

     $('td').click(function() { 
      _this.doSomething(); 
     }); 
    } 

    this.setSelection = function(x) { 
     alert('You clicked id ' + x); 
    } 
} 
1
$('td').click((function(e) { 
     // execute setSelection 
     this.setSelection(...); 
    }).bind(this)); 
+0

Cela fonctionnerait, mais cela signifierait que vous auriez besoin utiliser 'e.target' pour obtenir une référence au' td 'sur lequel on a cliqué, si nécessaire. –

0

Mon approche sera:

function Object() { 
    this.init = function() { 
    // delete table 
    // ... 
    // set table 
    $('tr').append('<td id="1">test</td>'); 

    $('td').click(function() { 
     setSelection(this); 
    }); 
    } 

    setSelection = function(x) { 
    alert('You clicked id ' + x); 
    } 
} 
0

J'ai résolu le problème ...

function Object() { 
    this.init = function() { 
     // delete table 
     // ... 
     // set table 
     $('tr').append('<td id="1">test</td>'); 

     this.setSelection(); 
    } 

    this.setSelection = function() { 
     $('td').click(function() { 
      alert('You clicked id ' + $(this).attr('id')); 
     }); 
    } 
} 

$(document).ready(function() { 
    x = new Object(); 
    x.init(); 
}); 
+1

Ceci n'est pas une solution à votre question. Et c'est faux - chaque appel de 'setSelection' ajoute un nouveau gestionnaire' click' aux éléments 'td'. Tous ces gestionnaires seront exécutés en séquence la prochaine fois que vous cliquerez. – Igor