[jquery] jQuery에서 CSS 클래스 변경 사항에 대한 이벤트 발생

jQuery를 사용하여 CSS 클래스를 추가하거나 변경하면 어떻게 이벤트를 발생시킬 수 있습니까? CSS 클래스를 변경하면 jQuery change()이벤트가 발생합니까?



답변

스크립트에서 클래스를 변경할 때마다 a trigger를 사용 하여 자신의 이벤트를 제기 할 수 있습니다 .

$(this).addClass('someClass');
$(mySelector).trigger('cssClassChanged')
....
$(otherSelector).bind('cssClassChanged', data, function(){ do stuff });

그러나 그렇지 않으면 아닙니다. 수업이 바뀔 때 이벤트를 시작하는 구운 방법은 없습니다. change()초점이 입력이 변경된 입력을 떠난 후에 만 ​​발생합니다.

$(function() {
  var button = $('.clickme')
      , box = $('.box')
  ;

  button.on('click', function() {
    box.removeClass('box');
    $(document).trigger('buttonClick');
  });

  $(document).on('buttonClick', function() {
    box.text('Clicked!');
  });
});
.box { background-color: red; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="box">Hi</div>
<button class="clickme">Click me</button>

jQuery 트리거에 대한 추가 정보


답변

더 나은 해결책은 @ RamboNo5와 @Jason의 두 가지 답변을 결합하는 것입니다.

addClass 함수를 재정의하고라는 사용자 정의 이벤트를 추가하는 것을 의미합니다. cssClassChanged

// Create a closure
(function(){
    // Your base, I'm in it!
    var originalAddClassMethod = jQuery.fn.addClass;

    jQuery.fn.addClass = function(){
        // Execute the original method.
        var result = originalAddClassMethod.apply( this, arguments );

        // trigger a custom event
        jQuery(this).trigger('cssClassChanged');

        // return the original result
        return result;
    }
})();

// document ready function
$(function(){
    $("#YourExampleElementID").bind('cssClassChanged', function(){
        //do stuff here
    });
});


답변

클래스 변경을 감지하려면 가장 좋은 방법은 Mutation Observers를 사용하여 모든 속성 변경을 완전히 제어하는 ​​것입니다. 그러나 리스너를 직접 정의하고 듣고있는 요소에 추가해야합니다. 좋은 점은 리스너가 추가되면 수동으로 아무것도 트리거 할 필요가 없다는 것입니다.

$(function() {
(function($) {
    var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;

    $.fn.attrchange = function(callback) {
        if (MutationObserver) {
            var options = {
                subtree: false,
                attributes: true
            };

            var observer = new MutationObserver(function(mutations) {
                mutations.forEach(function(e) {
                    callback.call(e.target, e.attributeName);
                });
            });

            return this.each(function() {
                observer.observe(this, options);
            });

        }
    }
})(jQuery);

//Now you need to append event listener
$('body *').attrchange(function(attrName) {

    if(attrName=='class'){
            alert('class changed');
    }else if(attrName=='id'){
            alert('id changed');
    }else{
        //OTHER ATTR CHANGED
    }

});
});

이 예제에서 이벤트 리스너는 모든 요소에 추가되지만 대부분의 경우 메모리를 저장하지는 않습니다. 이 “attrchange”리스너를 관찰하려는 요소에 추가하십시오.


답변

addClass 함수를 재정의하는 것이 좋습니다. 이 방법으로 할 수 있습니다 :

// Create a closure
(function(){
    // Your base, I'm in it!
    var originalAddClassMethod = jQuery.fn.addClass;

    jQuery.fn.addClass = function(){
        // Execute the original method.
        var result = originalAddClassMethod.apply( this, arguments );

        // call your function
        // this gets called everytime you use the addClass method
        myfunction();

        // return the original result
        return result;
    }
})();

// document ready function
$(function(){
    // do stuff
});


답변

개념 증명 만 :

요점을보고 주석을보고 최신 상태를 유지하십시오.

https://gist.github.com/yckart/c893d7db0f49b1ea4dfb

(function ($) {
  var methods = ['addClass', 'toggleClass', 'removeClass'];

  $.each(methods, function (index, method) {
    var originalMethod = $.fn[method];

    $.fn[method] = function () {
      var oldClass = this[0].className;
      var result = originalMethod.apply(this, arguments);
      var newClass = this[0].className;

      this.trigger(method, [oldClass, newClass]);

      return result;
    };
  });
}(window.jQuery || window.Zepto));

사용법은 매우 간단합니다. 관찰하려는 노드에 새 목록을 추가하고 일반적으로 클래스를 조작하십시오.

var $node = $('div')

// listen to class-manipulation
.on('addClass toggleClass removeClass', function (e, oldClass, newClass) {
  console.log('Changed from %s to %s due %s', oldClass, newClass, e.type);
})

// make some changes
.addClass('foo')
.removeClass('foo')
.toggleClass('foo');


답변

최신 jquery 돌연변이 사용

var $target = jQuery(".required-entry");
            var observer = new MutationObserver(function(mutations) {
                mutations.forEach(function(mutation) {
                    if (mutation.attributeName === "class") {
                        var attributeValue = jQuery(mutation.target).prop(mutation.attributeName);
                        if (attributeValue.indexOf("search-class") >= 0){
                            // do what you want
                        }
                    }
                });
            });
            observer.observe($target[0],  {
                attributes: true
            });

// $ target.addClass ( ‘search-class’)와 같이 $ target에있는 클래스 required-entry 를 갖는 div를 업데이트하는 코드


답변

change()CSS 클래스가 추가 또는 제거되거나 정의가 변경 될 때 실행되지 않습니다. 선택 상자 값이 선택되거나 선택되지 않은 상황에서 발생합니다.

CSS 클래스 정의가 변경되었는지 (프로그래밍 방식으로 수행 할 수 있지만 지루하고 일반적으로 권장되지는 않음) 또는 클래스가 요소에 추가되거나 제거되는지 여부를 확실하지 않습니다. 두 경우 모두 이러한 상황을 안정적으로 캡처 할 수있는 방법이 없습니다.

물론 이것에 대한 자신의 이벤트를 만들 수 있지만 이것은 자문으로 만 설명 할 수 있습니다 . 귀하의 코드가 아닌 코드는 캡처하지 않습니다.

또는 addClass()jQuery에서 (etc) 메소드를 재정의 / 교체 할 수 있지만 바닐라 Javascript를 통해 완료되면 캡처되지 않습니다 (이 메소드를 대체 할 수는 있지만).