【问题标题】:How to detect class changing by DOMAttrModified如何通过 DOMAttrModified 检测类更改
【发布时间】:2013-06-14 21:06:45
【问题描述】:

我需要检测一些类的变化,我使用了这个 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');
    }
});

谢谢你的建议。

【问题讨论】:

  • attrName 属性不是 jQuery 事件对象的一部分...您需要使用 e.originalEvent.attrName
  • 不相关,但突变事件已被弃用。你可能想看看 Mutation Observers
  • @PSL 我肯定会说这是相关的。提到弃用非常重要,这很重要。我看到了你对我的回答的评论——抱歉,我们一定是在同一时间创建了自己的小提琴并发布了它们。当我在这里看到你的评论时,我意识到至少举个例子是个好主意MutationObserver
  • @Ian 事实上我没有更新你的答案,所以想把它作为评论发布,然后我看到你已经更新了 Urs :)。没有任何问题我为类似的想法做了 +1 urs。 :) 事实上,我之前在回答与引导程序相关的question 时已经对此进行了探索。 :)
  • @PSL 没问题,如果我还没有这样做,我会很乐意添加你的小提琴,我很感激!酷,谢谢你的链接。是的,我肯定听说过这些功能,但我从未探索/使用过它们,所以设置它很有趣

标签: javascript jquery dom addclass dom-events


【解决方案1】:

直接的问题是attrName 属性不是jQuery 事件对象的一部分……您需要使用e.originalEvent.attrName。这是它的工作示例:

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);

演示: http://jsfiddle.net/R5rTy/1/

setTimeout是模拟随机发生的事件。

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


更新:

使用较新的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);

演示: http://jsfiddle.net/ybGCF/

参考:

【讨论】:

  • @Lukas 让我猜猜...在 Chrome 或 IE 中测试?我在 FireFox 中进行测试,它在那里工作正常,但决定在 Chrome 中进行测试,发现它不起作用。似乎并非所有浏览器都支持它:help.dottoro.com/ljfvvdnm.php#additionalEvents
  • @Lukas 我忘了提 - 我很久以前更新了我的答案,也使用了MutationObserver,它有不同的浏览器支持。希望我的回答现在涵盖了足够多的案例
  • 事实上,它利用了你的解决方案,我忘了加一些赞成票。非常感谢您的帮助,一切顺利。
  • @Lukas 完全没有问题,我只是想确保您没有遇到问题。很高兴它有帮助/有效!
猜你喜欢
  • 2011-04-21
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 2014-05-09
  • 2012-03-24
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
相关资源
最近更新 更多