2013-06-18 16 views
5

Ho bisogno di rilevare alcuni cambiamenti di classe, io uso per questo DOMAttrModified, ma qualcosa non va, cosa?Come rilevare il cambio di classe con DOMAttrModified

var first_img = $('body').find('li:first').find('img'); 

first_img.on('DOMAttrModified',function(e){ 
    if (e.attrName === 'class') { 
     if ($(this).hasClass('current-image')) { 
      $(this).removeClass().addClass('previous-image'); 
     } 
     console.log('log'); 
    } 
}); 

Thx per un consiglio.

+1

La proprietà 'attrName' non è parte di oggetto dell'evento di jQuery ... è necessario utilizzare' e.originalEvent.attrName' – Ian

+1

Unrelated, Ma gli eventi di mutazione sono stati deprecati. Probabilmente potresti voler dare un'occhiata a Mutation Observers – PSL

+1

@PSL Direi che è correlato. Menzionare la deprecazione è molto importante, quindi ottimo punto. E ho visto il tuo commento sulla mia risposta - mi spiace, dobbiamo aver creato i nostri violini e averli pubblicati nello stesso momento. Quando ho visto il tuo commento qui, ho capito che sarebbe stata una buona idea dare almeno un esempio con 'MutationObserver' – Ian

risposta

12

Il problema immediato è che una proprietà attrName non fa parte dell'oggetto dell'oggetto jQuery ... è necessario utilizzare . Ecco un esempio di farlo funzionare:

var first_img = $("body").find("div").first(); 

first_img.on("DOMAttrModified", function (e) { 
    if (e.originalEvent.attrName === "class") { 
     console.log("##DOMAttrModified, class changed"); 
     if ($(this).hasClass("current-image")) { 
      console.log("##Element has 'current-image' class, changing"); 
      $(this).removeClass().addClass("previous-image"); 
     } 
    } 
}); 

setTimeout(function() { 
    first_img.addClass("current-image"); 
}, 1000); 

DEMO:http://jsfiddle.net/R5rTy/1/

Il setTimeout è quello di simulare l'evento in modo casuale accadendo.

A quanto pare, l'evento DOMAttrModified non è supportata in tutti i browser - http://help.dottoro.com/ljfvvdnm.php#additionalEvents


UPDATE:

Utilizzando la più recente MutationObserver, il seguente mostra l'uso di entrambe le idee:

var firstImg, observerConfig, firstImgObserver; 

firstImg = $("body").find("div").first(); 
observerConfig = { 
    attributes: true, 
    childList: true, 
    characterData: true 
}; 
firstImgObserver = new MutationObserver(function (mutations) { 
    mutations.forEach(function (mutation) { 
     var newVal = $(mutation.target).prop(mutation.attributeName); 
     if (mutation.attributeName === "class") { 
      console.log("MutationObserver class changed to", newVal); 
     } else if (mutation.attributeName === "id") { 
      console.log("MutationObserver id changed to", newVal); 
     } 
    }); 
}); 

firstImgObserver.observe(firstImg[0], observerConfig); 
// later, you can stop observing 
//observer.disconnect(); 

firstImg.on("DOMAttrModified", function (e) { 
    var newVal = $(this).prop(e.originalEvent.attrName); 
    console.log("DOMAttrModified", e.originalEvent.attrName, "changed to", newVal); 
}); 

setTimeout(function() { 
    firstImg.addClass("previous-image").addClass("fdsa"); 
}, 1000); 

DEMO:http://jsfiddle.net/ybGCF/

Riferimento:

+0

ma non succede nulla :) non ho alcun registro – Lukas

+0

@Lukas Fammi indovinare .. .Prova in Chrome o IE? Stavo testando in FireFox e per me funziona bene, ma ho deciso di provare su Chrome e ho scoperto che non funzionava. Sembra che non sia supportato in tutti i browser: http://help.dottoro.com/ljfvvdnm.php#additionalEvents – Ian

+0

@Lukas Ho dimenticato di menzionare - Ho aggiornato la mia risposta molto tempo fa per usare anche 'MutationObserver', che ha supporto per browser diverso. Spero che la mia risposta ora copra abbastanza casi – Ian

Problemi correlati