How to detect class changing by DOMAttrModified

前端 未结 1 1220
萌比男神i
萌比男神i 2020-12-06 03:17

I need to detect some class changing, i use for this DOMAttrModified, but something is wrong, what?

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


        
相关标签:
1条回答
  • 2020-12-06 03:43

    The immediate problem is that a attrName property isn't part of jQuery's event's object...you need to use e.originalEvent.attrName. Here's an example of it working:

    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/

    The setTimeout is to simulate the event randomly happening.

    Apparently, the DOMAttrModified event is not supported in all browsers - http://help.dottoro.com/ljfvvdnm.php#additionalEvents


    UPDATE:

    Using the newer MutationObserver, the following shows the use of both ideas:

    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/

    Reference:

    • https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
    0 讨论(0)
提交回复
热议问题