2013-06-18 34 views
5

我需要检测一些类的更改,我用这个DOMAttrModified,但有些错误,什么?如何检测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的意见。

+1

的'attrName'属性不是jQuery的事件的对象的一部分......你需要使用'e.originalEvent.attrName' – Ian

+1

无关,但突变事件已被弃用。你可能想看看突变观察家 – PSL

+1

@PSL我肯定会说这是相关的。提起贬低是非常重要的,非常重要。我看到了你对我的回答的评论 - 对不起,我们必须创建自己的小提琴并在同一时间发布。当我在这里看到你的评论时,我意识到这是一个好主意,至少用'MutationObserver'给出一个例子 – Ian

回答

12

当前的问题是attrName属性不是jQuery事件对象的一部分......您需要使用。下面是它的工作的例子:

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/

setTimeout是模拟事件发生随机。

显然,在所有的浏览器不支持DOMAttrModified事件 - http://help.dottoro.com/ljfvvdnm.php#additionalEvents


UPDATE:

使用较新的MutationObserver,下面说明了如何使用这两种思路:

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/

参考:

+0

但没有任何事情发生:)我没有任何日志 – Lukas

+0

@Lukas让我猜猜.. 。在Chrome或IE中测试?我在FireFox测试,它在那里工作正常,但决定在Chrome中测试,发现它没有工作。它看起来像它不是在所有的浏览器都支持:http://help.dottoro.com/ljfvvdnm.php#additionalEvents – Ian

+0

@Lukas我忘了说 - 我我的答案更新很久以前也使用'MutationObserver',其中有不同的浏览器支持希望我的答案现在涵盖了足够的案例 – Ian