通过我无法控制的代码检测类删除

Detect class removal by code I have no control over

提问人:prettyInPink 提问时间:3/6/2017 最后编辑:TschallackaprettyInPink 更新时间:3/6/2017 访问量:2306

问:

当一个类被从元素中删除时,我需要调用一个函数,我无法控制何时删除该类。

目前我可以使用 setTimeout 让它工作,所以它是这样的:

function checkClassRemoval() {
    if (!$('.myElement').hasClass('mySecondClass')) {
        // run function
    }   
}   

setTimeout(checkClassRemoval, 1000);

有没有比每秒运行一次检查更好的方法来捕获类的删除?

JavaScript jQuery

评论

0赞 Tschallacka 3/6/2017
你知道类的删除是否是由jQuery完成的吗?
0赞 Jai 3/6/2017
突变观察者是您可以遵循的另一种方法。
0赞 Rahul 3/6/2017
是否可以检查是否在jquery中删除了类
0赞 Tschallacka 3/6/2017
我不同意@guradio,这是一个问题。不是改进问题
1赞 Mast 3/6/2017
@guradio 不!这在代码审查中会非常偏离主题!在提出更多此类建议之前,请阅读他们的指南

答:

10赞 VadimB 3/6/2017 #1

为此,您可以使用 MutationObserver 类。它允许订阅特定的 DOM 元素更改并在发生此更改时触发事件:

var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutationRecord) {
        console.log('style changed!');
    });    
});

var target = document.getElementById('someId');
observer.observe(target, { attributes : true, attributeFilter : ['style', 'className'] });

有关此对象的支持,请参阅 canIuse.com

评论

0赞 rzb 8/2/2019
我相信 attributes: true 在使用 attributeFilter 时是多余的。
1赞 diachedelic 8/22/2019
我需要指定而不是在 Chrome 上"class""className"
3赞 Nedim Hozić 3/6/2017 #2

您可以覆盖 addClass/removeClass jQuery 函数并像这样扩展它们:

(function(){
    var nativeMethod= jQuery.fn.addClass;

    jQuery.fn.addClass = function(){
        var result = nativeMethod.apply( this, arguments );
        jQuery(this).trigger('cssClassChanged');
        return result;
    }
})();

//Your code:
$(function(){
    $("#yourElement").bind('cssClassChanged', function(){ 
        console.log("triggered")
    });
});