1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <style type="text/css">
        .box {
            width: 400px;
            height: 400px;
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <div id="wrapper">
        <div class="box" contenteditable="true">
            <input type="text" class="inp" value="ㅇㅇㅇ"> 여기에 글짜를 쳐봐라.
        </div>
        
        <button class="btn1">css추가</button>
        <button class="btn2">css추가</button>
        <button class="btn3">css추가</button>
        <button class="btn4">sytle속성삭제</button>
        <button class="btn5">data속성추가</button>
        <button class="btn6">data속성변경</button>
        <button class="btn7">addClass</button>
        <button class="btn8">removeClass</button>
        <button class="btn9">innerHTML</button>
        <button class="btn10">innerHTML</button>
        <button class="btn11">text 추가</button>
        <button class="btn12">text 추가</button>
    </div>
    <script src="lib/jQuery/2.2.3/jquery.min.js"></script>
    <script type="text/javascript">
 
    // IE는 11버전부터 지원한다.
    /*
    childList              대상 노드의 자식 요소 (텍스트 노드 포함)의 추가 및 제거를 감시
    attributes             대상 노드의 속성 변경을 감시
    characterData        대상 노드의 텍스트 콘텐츠(자식 텍스트 노드) 값에 대한 변경 사항을 모니터링 (2번 이벤트 발생 ??????)
    subtree               대상 노드 및 대상요소의 자식 자손까지 모두 감시 (childList, attributes 또는 characterData도 true이어야 함)
    attributeOldValue      속성 값이 변경 전의 값을 받을 수 있다. 
    characterDataOldValue 요소 내부 텍스트를  변경할 경우 이전 값을 받을 수 있다. (2번 이벤트 발생 ??????)
    attributeFilter          감시할 속성명들을 배열 형태로 정의할 수 있다. (네임스페이스 빼고 입력) 
                          예를 들어 [“value”] 일 경우 해당 요소의 value 값만 바뀔 경우에만 감시 이벤트가 발생한다.
    */
 
    (function($) {
        $.fn.watch = function(cb) {
            var conf = { 
                attributes:true, 
                subtree:true, 
                childList:true, 
                attributeOldValue:true, 
                //characterData:true,
                //characterDataOldValue:true,
                // attributeFilter: ["data-a"], // data-a 속성 변경만 감시
            };
            $(this).each(function() {
                var that = this;
                function callback(record) {
                    // console.log(typeof cb);  // function
                    // cb(parm, this); 
                    // console.log(this); // MutationObserver Object
                    // console.log(record); // [MutationRecord]
                    cb.call(that, record, this); // this 바인딩
                }
                // observer.disconnect();  // 감시를 중지
                // observer.observe(target, config);
                (new MutationObserver(callback)).observe(this, conf);        
            });
        };
    })(jQuery);
 
    var box = $('.box');
    box.watch(function(record, observer) {  
        console.log(this);
        console.log(record);
        console.log(observer);
        console.log(record[0].type);
        console.log(record[0].oldValue); // 속성 변경 전의 값
        console.log(record[0].attributeName);
        //console.log(record[0].characterDataOldValue); 
    });
 
    $(".btn1").click(function(e) {
        box.css("top""10px");
    });
    $(".btn2").click(function(e) {
        box.css("background-color""red");
    });    
    $(".btn3").click(function(e) {
        box.css("border-color""blue");
    });        
    $(".btn4").click(function(e) {
        box.removeAttr('style')
    });    
    $(".btn5").click(function(e) {
        box.attr("data-a""5000");
    });
    $(".btn6").click(function(e) {
        box.attr("data-a""9000");
    });        
    $(".btn7").click(function(e) {
        box.addClass('boxtest');
    });
    $(".btn8").click(function(e) {
        box.removeClass('boxtest');
    });    
    $(".btn9").click(function(e) {
        box.html("<div>안녕하세용<div>");
    });                
    $(".btn10").click(function(e) {
        box.html("<div>안녕하세용22<div>");
    });    
    $(".btn11").click(function(e) {
        box.text("xxxxxxxxxxxxxxxxxxxxxxxxx");   // (2번 이벤트 발생 ??????)
    });
    $(".btn12").click(function(e) {
        box.text(box.text()+"===================="); // (2번 이벤트 발생 ??????)
    });        
    </script>
</body>
</html>


참고 : https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver

참고 : https://msdn.microsoft.com/ko-kr/library/dn265034(v=vs.85).aspx

참고 : http://ukjinplant.tumblr.com/post/109571347591/mutationevent-mutationobserver

반응형
Posted by 힘없는염소