2010-09-17 4 views
19

Existe-t-il un moyen pour jquery d'écouter une modification de la classe d'un nœud et de prendre des mesures si la classe change pour une classe spécifique? Plus précisément, j'utilise le plugin jquery tools tabs avec le diaporama et pendant que le diaporama est en cours de lecture, je dois être capable de détecter quand le focus est sur un onglet/ancre particulier afin que je puisse afficher un div spécifique.Écoute du changement de classe dans jquery

Dans mon exemple précis, je dois savoir quand:

<li><a class="nav-video" id="nav-video-video7" href="#video7-video">Video Link 7</a></li> 

changements à ce qui suit avec la classe ajouté « courant »:

<li><a class="nav-video" id="nav-video-video7 current" href="#video7-video">Video Link 7</a></li> 

Ensuite, je veux afficher une div à ce moment.

Merci!

+1

Cette [questions] [1] réponses peut aider. [1]: http://stackoverflow.com/questions/6034161/how-can-i-detect-when-an-html-elements-class-changes –

Répondre

2

Voici quelques autres découvertes qui pourraient fournir une solution:

  1. Most efficient method of detecting/monitoring DOM changes?
  2. How can I detect when an HTML element’s class changes?
  3. Monitoring DOM Changes in JQuery

Et comme il a été suggéré dans # 2, pourquoi ne pas faire current une La classe qui est ajoutée, plutôt qu'un ID, et le CSS suivant gèrent l'action show/hide.

<style type='text/css> 
    .current{display:inline;} 
    .notCurrent{display:none;} 
</style> 

pourrait aussi valoir la peine de se pencher sur .on() in jquery.

+2

Google m'a amené ici. J'ai regardé ".on()" mais il n'était pas clair quel événement pourrait se déclencher quand une classe est ajoutée à un élément. Je suis dans une situation similaire à l'OP, et je devais me déclencher quand une classe est ajoutée, mais je ne peux pas me lier à l'événement click original car le plugin appelle preventDefault sur l'événement click. –

+0

Cela fait un moment que j'ai posté cette question et franchement, j'ai oublié comment je l'ai géré. Utiliser CSS pour cacher/afficher une div serait la solution évidente mais je suis à peu près sûr que j'ai dû avoir des choses supplémentaires qui ne me permettaient pas de rester aussi simple. En tout cas, j'ai choisi la solution @jsuar car elle incluait des liens utiles. – Snazawa

0

Avec quelque chose comme ça, vous avez essentiellement deux options, les rappels ou l'interrogation.

Étant donné que vous ne pouvez pas déclencher un événement lorsque le DOM mute de cette manière (de manière fiable sur toutes les plates-formes), vous devrez peut-être recourir à l'interrogation. Pour être un peu plus gentil à ce sujet, vous pouvez essayer d'utiliser l'API requestAnimationFrame plutôt que d'utiliser nativement quelque chose comme setInterval.

Prendre l'approche la plus fondamentale (à savoir en utilisant setInterval et en supposant jQuery), vous pouvez essayer quelque chose comme ceci:

var current_poll_interval; 
function startCurrentPolling() { 
    current_poll_interval = setInterval(currentPoll, 100); 
} 
function currentPoll() { 
    if ($('#nav-video-7').hasClass('current')) { 
    // ... whatever you want in here ... 
    stopCurrentPolling(); 
    } 
} 
function stopCurrentPolling() { 
    clearInterval(current_poll_interval); 
} 
20

Vous pouvez lier l'événement DOMSubtreeModified. J'ajoute un exemple ici:

HTML

<div id="mutable" style="width:50px;height:50px;">sjdfhksfh<div> 
<div> 
    <button id="changeClass">Change Class</button> 
</div> 

JavaScript

$(document).ready(function() { 
    $('#changeClass').click(function() { 
    $('#mutable').addClass("red"); 
    }); 

    $('#mutable').bind('DOMSubtreeModified', function(e) { 
     alert('class changed'); 
    }); 
}); 

http://jsfiddle.net/hnCxK/13/

0

Après avoir étudié cela, la meilleure réponse que j'ai trouvé est ce plugin jQuery donné en this SO answer où il lie une fonction d'écoute ion sur tout changement d'attribut d'éléments HTML

Questions connexes