2010-09-17 10 views
19

Gibt es eine Möglichkeit in Jquery auf eine Änderung der Klasse eines Knotens zu hören und dann etwas zu tun, wenn die Klasse in eine bestimmte Klasse wechselt? Insbesondere verwende ich das jquery tools tools Plugin mit der Slideshow und während die Slideshow spielt, muss ich in der Lage sein zu erkennen, wenn der Fokus auf einem bestimmten Tab/Anker liegt, so dass ich ein bestimmtes div einblenden kann.Listen für Änderung der Klasse in Jquery

In meinem speziellen Beispiel, ich muss wissen, wann:

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

Änderungen an den folgenden mit der Klasse „aktuellen“ hinzugefügt:

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

Dann möchte ich, dass ein div sichtbar machen Moment.

Danke!

+1

Diese [Fragen] [1] Antworten können helfen. [1]: http://stackoverflow.com/questions/6034161/how-can-i-detect-when-an-html-elements-class-changes –

Antwort

2

Einige andere Funde, die eine Lösung bieten könnte:

  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

Und da es eine in vorgeschlagen wurde # 2, warum nicht current Klasse, die hinzugefügt wird, und nicht eine ID, und die folgende CSS-Anweisung behandelt die show/hide-Aktion.

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

könnte auch wert sein, in .on() in jquery zu suchen.

+2

Google hat mich hierher gebracht. Ich schaute auf ".on()", aber es war nicht klar, welches Ereignis ausgelöst werden könnte, wenn eine Klasse zu einem Element hinzugefügt wird. Ich bin in einer ähnlichen Situation wie der OP, und musste ausgelöst werden, wenn eine Klasse hinzugefügt wird, aber ich kann nicht an das ursprüngliche Klickereignis binden, da das Plugin preventDefault für das Klickereignis aufruft. –

+0

Es ist schon eine Weile her, seit ich diese Frage gestellt habe und ehrlich gesagt vergesse ich, wie ich damit umgegangen bin. Die Verwendung von CSS zum Ein-/Ausblenden eines Divs wäre die offensichtliche Lösung, aber ich bin mir ziemlich sicher, dass ich einige zusätzliche Dinge gehabt haben musste, die mich davon abgehalten haben, es so einfach zu halten. In jedem Fall habe ich die @jsuar-Lösung gewählt, da sie einige hilfreiche Links enthielt. – Snazawa

0

Mit so etwas haben Sie im Wesentlichen zwei Optionen, Callbacks oder Polling.

Da möglicherweise kein Ereignis ausgelöst werden kann, wenn das DOM auf diese Weise mutiert (zuverlässig über alle Plattformen hinweg), müssen Sie möglicherweise auf Abfragen zurückgreifen. Um ein bisschen netter zu sein, könnten Sie versuchen, den requestAnimationFrame api zu verwenden, anstatt nur etwas wie setInterval nativ zu verwenden.

Unter dem grundlegendsten Ansatz (das heißt mit setInterval und unter der Annahme, jQuery) Sie so etwas wie dies versuchen könnten:

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

Sie können das DOMSubtreeModified Ereignis binden. Ich füge hier ein Beispiel:

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

Danach die Erforschung, die beste Antwort, die ich gefunden habe, ist die jQuery-Plugin gegeben in this SO answer, wo es eine Listener-Funktion bindet Ionen bei jeder Attributänderung von HTML-Elementen

Verwandte Themen