web-dev-qa-db-fra.com

TypeError non capturé: impossible d'appeler la méthode 'toLowerCase' d'undefined

J'ai rencontré une erreur très vague lors de la manipulation simple de DOM jQuery.

La ligne qui a déclenché l'erreur est la suivante:

$(this).closest('tr').remove();

L'erreur, comme indiqué dans le titre, est:

TypeError non capturé: impossible d'appeler la méthode 'toLowerCase' d'undefined

dans le fichier: jquery-1.6.2.js.

J'ai déjà essayé avec jQuery 1.6.3 et jQuery 1.5.1, mais rien n'a changé. Je continue de recevoir l'erreur.

La ligne ci-dessus est liée à un bouton qui, lorsqu'il est cliqué, soumet une demande AJAX POST, puis en cas de succès, il supprime sa propre <tr> J'ai déjà essayé une autre voie en faisant:

$(this).parent().parent().remove() mais à ma grande surprise, cela n'a rien fait.

J'utilise Chrome, au cas où cela importerait, mais j'obtiens la même erreur dans FF.

ÉDITER:

Voici mon code:

$(".remove").live('click', function(e)  {
    var str = $(this).attr('id').match(/\[(.*?)\]\[(.*?)\]/);
    var type = str[1];
    var id = str[2];

            // IF I PUT THE remove() HERE, IT WORKS.

    $.ajax({
        type: 'POST',
        url: '/admin/ajax_remove_event_detail',
        data: {type: type, id: id},
        success:function(res)   {
            if(res)
            {
                $(this).closest('tr').remove();
                // this gives me an error
            }
            else
            {
              // error handling 
            }
        }
    });

    e.preventDefault();
});

Si je mets le remove () en dehors du if quelque part, cela fonctionne. Pourquoi ne fonctionne-t-il pas quand il est à l'intérieur de l'appel ajax/if? Ça n'a aucun sens pour moi? :(

Une aide ici? Merci d'avance.

24
cabaret

Je ne sais pas ce que vous attendez la valeur de this pour être dans votre gestionnaire de "succès", mais je parie que ce n'est pas ce que vous pensez. Enregistrez this en dehors de l'appel "$ .ajax ()":

var clicked = this;
$.ajax(
  // ...
  success: function(res) {
    if (res) {
      $(clicked).closest('tr').remove();
    }
    else {
      // ...
    }
  }
);
41
Pointy

Dans votre demande, $ (this) n'est pas le .remove élément. C'est un problème de fermeture.

Vous pouvez donc attribuer $ (this) à une variable avant et l'appeler après

7
Py.
// assign this to a variable

var val = this;

// Use

$(val).closest('tr').remove(); // It worked for me

Au lieu de :

$(this).closest('tr').remove();
1
Nadeem Shinwari