Portée variable: this.remove n’est pas une fonction

this.remove () n’est pas une fonction. Comment venir?

var vehicle = function () { return { init: function () { jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); this.remove(); }); }, remove: function () { alert('test'); } } }(); jQuery().ready(vehicle.init); 

Désolé pour la confusion. J’essaie d’appeler ma propre fonction “supprimer”. Ceci est simplement une classe pour gérer les véhicules sur ma page. C’est le début et il aura beaucoup plus de fonctions que juste init / remove.

Puisque vous avez dit que vous essayez d’appeler votre propre fonction de remove , voici comment procéder:

 var vehicle = (function () { return { init: function () { var that = this; // step one jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); that.remove(); }); }, remove: function () { alert('test'); } } }()); // step zero - wrap the immediate invocation in parens jQuery(function () { vehicle.init(); // step two ); 

this un élément DOM. Pour utiliser la méthode .remove() de jQuery, vous devez l’envelopper dans un object jQuery.

 $(this).remove(); 

EDIT: Si vous espériez appeler la fonction remove() dans l’object vehicle , appelez:

 vehicle.remove(); 

De plus, si vous espériez raccourcir votre appel .ready() , vous pouvez le faire:

 jQuery(vehicle.init); 

D’après les notes de publication de jQuery 1.4 :

La technique jQuery().ready() fonctionne toujours dans la version 1.4, mais elle est obsolète. Veuillez utiliser jQuery(document).ready() ou jQuery(function(){}) .

Peut-être que vous cherchez quelque chose comme ça?

 var vehicle = new function () { var self = this; this.init = function () { jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); self.remove(); }); }; this.remove = function () { alert('test'); }; }; 

… ou comme ça peut-être? C’est un peu difficile de dire ce que vous allez faire …

 var vehicle = new function () { function remove () { alert('test'); } this.init = function () { jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); remove.call(this); }); }; }; 

Remarque – nous sums tous un peu confus parce que nous ne soaps pas quelle fonction “supprimer” vous souhaitez appeler.

Le problème est que vous passez la référence à la fonction “init”, mais quand on l’appelle la variable “this” se référera à l’object window, pas à la valeur de “vehicle”. Pourquoi? Parce qu’en Javascript, la valeur “this” ne dépend que de la manière dont une fonction est appelée. Le fait que deux fonctions soient définies dans le même object n’a absolument rien à voir avec cela.

Essayez de faire ceci à la place:

 jQuery(function() { vehicle.init(); }); 

Lorsque vous appelez la fonction “init” de cette façon – en la référençant explicitement comme une propriété de l’object “vehicle” – alors Javascript liera “this” à la valeur de “vehicle”.

edit oh wait, je viens de remarquer que vous allez aussi devoir réviser votre fonction “init”, car ce code dans le gestionnaire de “click” va être appelé par jQuery de manière à lier “this” en cela. contexte à l’élément affecté. Ainsi, si vous souhaitez conserver la référence “véhicule”, procédez comme suit:

  init: function () { var originalThis = this; jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); originalThis.remove(); }); }, 
 var vehicle = function () { return { init: function () { var self = this; jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); self.remove(); }); }, remove: function () { alert('test'); } } }(); jQuery().ready(function() { vehicle.init(); }); 

Lors de l’appel d’une fonction en tant que méthode, “this” fait référence à l’object qui l’invoque. Dans jQuery, la fonction transmise est invoquée en tant que méthode de l’élément html. “This” devient l’élément.

Pour vous assurer que vous vous référez au bon object, vous devez créer une référence à l’object d’origine.

  var vehicle = function () { var that = { init: function () { jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); that.remove(); }); }, remove: function () { alert('test'); } } return that; }(); jQuery().ready(vehicle.init);