2010-06-29 4 views
5

C'è un modo per attivare un evento in jQuery quando un elementi classi sono cambiati?Classe evento Change in jQuery

Esempi:

<img class="selected" /> 

in

<img class="selected newclass" /> 

attiva un evento


E

<img class="selected" /> 

in

<img class="" /> 

attivare un evento

+1

Cosa vuoi fare quando succede? –

risposta

9

Potreste essere in grado di aggirare un po 'hacky . Hook.addClass() & .removeClass() in questo modo:

var _addClass = $.fn.addClass, 
    _removeClass = $.fn.removeClass; 

$.fn.addClass = function(){ 
    // do whatever here 
    return _addClass.apply(this, arguments); 
} 

$.fn.removeClass = function(){ 
    // do whatever here 
    return _removeClass.apply(this, arguments); 
} 

questo modo, si supponendo che sono solo interessati a guardare elementi cambiamenti di classe con jQuery, è possibile attivare qualsiasi codice sul adding o removing classi. Di nuovo, solo se stai usando jQuery, per questo esempio.

Ovviamente, è possibile hook e overwrite qualsiasi funzione javascript in questo modo.

come Nick Craver menzionato in un commento, ci sono molti altri metodi jQuery che possono add o remove una classe di elementi. Si dovrà hook tutti coloro, e cioè:

.addClass() 
.removeClass() 
.toggleClass() 
.removeAttr('class') 
.attr('class', 'changed') 

se non si sa esattamente quali metodi sono chiamati per manipolare una classe, si dovrebbe preoccuparsi di tutte quelle.

+0

+1 per avere questa idea ..! – Kai

+0

+1 soluzione elegante. – jensgram

+1

Elegante, ma fai attenzione ad altri metodi qui, '.toggleClass()', '.attr ('class')', '.class =', ci sono un * sacco * di modi per cambiare classe. Penso che ci sia una soluzione ancora più semplice, ma dobbiamo sapere che cosa sta cercando l'OP. Anche '.addClass ('alreadyHadThisClass')' e '.removeClass ('DidNotHaveThis')' non hanno alcun effetto netto, avresti bisogno di gestire anche questo. –

-1

Non credo che questo sia possibile.

Gli eventi si basano sulle azioni dell'utente, quindi fare clic su, dblclick, mouseover ecc. Sono tutte azioni dell'utente.

Si consiglia di elaborare una sorta di blocco di dati su ogni elemento e poi costruire un piccolo sistema che si integra in jQuery .class() e .attr() metodi in modo che quando il codice aggiorna una classe si aggiungerà i dati a quell'elemento tenendo la classe precedente ,

Quindi se la classe precedente è diversa dalla classe impostata, attiva i tuoi eventi.

ciò che intendo per integrare è

var old_ClassFunc = $.fn.class; //Save it 

var $.fn.class = function() 
{ 
    if($(this).data('old-class')) 
    { 
     if($(this).data('class_callback'))# 
     { 
      $(this).data('class_callback')(this); 
     } 
    } 
    $(this).data('old-class',$(this).attr('class')); //Update Data 
    return old_class.apply(this,arguments); 
} 

allora si può fare come

$('element').data('class_callback',function(context){ 
    alert('Element class has changed'); 
}) 

Spero che questo ti dà un aiuto

+1

-1 per "Gli eventi si basano sulle azioni dell'utente" – sbichenko