2010-05-15 10 views
0

J'utilise un plugin jQuery tooltip.Info-bulle jQuery: Problème avec remove()

J'ai HTML comme ceci:

<li class="term ui-droppable"> 
    <strong>Fall 2011</strong> 
    <li class="course ui-draggable">Biological Statistics I<a class="remove-course-button" href="">[X]</a></li> 
    <div class="term-meta-data"> 
     <p class="total-credits too-few-credits">Total credits: 3</p> 
     <p class="median-GPA low-GPA">Median Historical GPA: 2.00</p> 
    </div> 
</li> 

Je veux retirer l'élément .course. Donc, je joins un gestionnaire de clic au <a>:

function _addDeleteButton(course, term) { 
    var delete_button = $('<a href="" class="remove-course-button" title="Remove this course">[X]</a>'); 
    course.append(delete_button); 

    $(delete_button).click(function() { 
     course.remove(); 
     return false; 
    }).tooltip(); 
} 

Tout cela fonctionne très bien, en termes de fixation du gestionnaire de clic. Toutefois, lorsque course.remove() est appelé, Firebug signale une erreur dans tooltip.js:

Line 282 
tsettings is null 

if ((!IE || !$.fn.bgiframe) && tsettings.fade) { 

Qu'est-ce que je fais mal? Si le lien contient une info-bulle, dois-je l'enlever spécialement?

MISE À JOUR: Suppression .tooltip() résoudre le problème. Je voudrais le garder, mais cela me fait soupçonner que mon utilisation de .tooltip() est incorrecte ici.

Répondre

1

Le module .tooltip() a plusieurs gestionnaires qui se rattachent à l'élément, à savoir mouseover, mouseout et click. Si vous supprimez l'élément, à .unbind() tous ces événements afin qu'ils ne fonctionnent pas, comme ceci:

delete_button.click(function() { 
    course.unbind().remove(); 
    return false; 
}).tooltip(); 

Un autre changement à noter est que delete_button est déjà un objet jQuery, l'enveloppant dans $() à nouveau just clones it :)

L'erreur se produit parce qu'elle essaie d'extraire et d'utiliser ses paramètres de l'élément après .remove() via jQuery.data(), dans lequel jQuery supprime ses données du cache. Cette approche empêche tout redémarrage de ces gestionnaires d'info-bulles, donc peu importe que les données aient disparu (comme il se doit), car rien ne le recherchera maintenant.

2

J'ai eu ce même problème et j'ai dû retarder l'appel de .remove() pour éviter l'erreur. Donc quelque chose comme ce qui suit peut fonctionner pour vous:

$(delete_button).click(function() { 
    setTimeout(function() { course.remove() } , 1); 
    return false; 
}).tooltip();