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.
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 {
// ...
}
}
);
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
// assign this to a variable
var val = this;
// Use
$(val).closest('tr').remove(); // It worked for me
Au lieu de :
$(this).closest('tr').remove();