jQuery로 요소 콘텐츠 변경 감지


113

change() 함수가 작동하고 양식 요소의 변경을 감지하지만 DOM 요소의 컨텐츠가 변경된시기를 감지하는 방법이 있습니까?

#content양식 요소 가 아닌 경우 작동하지 않습니다.

$("#content").change( function(){
    // do something
});

나는 다음과 같은 일을 할 때 이것이 트리거되기를 원합니다.

$("#content").html('something');

또한 html()또는 append()함수에는 콜백이 없습니다.

어떤 제안?


내가 알고있는 오래된 질문이지만 우아한 솔루션에 대한 내 대답을 확인하십시오. stackoverflow.com/a/23826615/744975
— Andrew Atkinson

답변:


26

이것들은 돌연변이 사건 입니다.

jQuery에서 돌연변이 이벤트 API를 사용하지 않았지만 간단한 검색 으로 GitHub 에서이 프로젝트로 이동 했습니다. 나는 프로젝트의 성숙도를 모른다.


17
이 뮤 테이션 이벤트 플러그인은 이벤트를 jQuery 뮤 테이션 메소드에 연결하기 때문에 작동하지 않습니다. jQuery 자체가 요소를 변경하려고 할 때 시작되지만 요소가 jQuery 외부에서 변경 될 때 발생하지 않습니다. 그들은 문서의 변경 사항을 보지 않습니다. 대신이 작은 플러그인을 확인하세요. stackoverflow.com/questions/3233991/jquery-watch-div/…
— Sebastián Grignoli

10
인터넷 검색 및 시도한 적이없는 라이브러리 링크를 게시하는 것은 그다지 유용하지 않습니다. (내가 downvoting시에 메시지가 되었기 때문에 언급.)
— 정지 비방 모니카 Cellio


돌연변이 이벤트의 대안은 MutationObservers 인 것 같습니다 .
— WoodrowShigeru 2015

69

이 게시물은 1 년이 지났지 만 비슷한 문제가있는 사람들에게 다른 솔루션 접근 방식을 제공하고 싶습니다.

  1. jQuery 변경 이벤트는 다른 것이 조작되면 (예 : div) 해당 조작이 코드에서 발생하기 때문에 사용자 입력 필드에서만 사용됩니다. 따라서 조작이 발생하는 위치를 찾은 다음 거기에 필요한 것을 추가하십시오.

  2. 그러나 어떤 이유로 든 가능하지 않다면 (복잡한 플러그인을 사용하고 있거나 "콜백"가능성을 찾을 수없는 경우) 내가 제안하는 jQuery 접근 방식은 다음과 같습니다.

    ㅏ. 간단한 DOM 조작의 경우 jQuery 체인 및 순회를 사용하십시오.$("#content").html('something').end().find(whatever)....

    비. 다른 작업을 수행하려면 bind사용자 지정 이벤트와 함께 jQuery를 사용 하고triggerHandler

    $("#content").html('something').triggerHandler('customAction');
    
    $('#content').unbind().bind('customAction', function(event, data) {
       //Custom-action
    });

다음은 jQuery 트리거 핸들러에 대한 링크입니다. http://api.jquery.com/triggerHandler/


1
최종 생각. 위의 내용은 상당히 포괄적이어야합니다. 숨겨진 입력 필드의 값을 #content html의 값으로 업데이트 한 다음 변경 이벤트를 숨겨진 입력 필드에 바인딩 할 수 있습니다. :) 많은 옵션
— Kyle

7
+1 "조작이 발생한 위치를 찾은 다음 거기에 필요한 것을 추가하십시오." 어떤 해킹 / 플러그인 :)없이 이초 내 문제를 해결
— 하틀리 브로디

여기서 제안하는 유일한 변경 사항은에서 bind처리기가 bool.
— Serj Sagan

15

브라우저는 <div>요소에 대한 onchange 이벤트를 시작하지 않습니다 .

그 이유는 자바 스크립트로 수정하지 않는 한 이러한 요소가 변경되지 않는다는 것입니다. 이미 요소를 수정해야하는 경우 (사용자가 수행하지 않고) 다음과 같이 요소를 수정하는 동시에 적절한 동반 코드를 호출 할 수 있습니다.

 $("#content").html('something').each(function() { });

다음과 같은 이벤트를 수동으로 실행할 수도 있습니다.

 $("#content").html('something').change();

이러한 솔루션 중 어느 것도 귀하의 상황에 적합하지 않은 경우 구체적으로 달성하려는 작업에 대해 더 많은 정보를 제공 할 수 있습니까?


11
이것은 당신이 모든 자바 스크립트를 작성했다고 가정합니다.
— Myster

감사합니다!!!! 이것은 내가 6 시간 동안 쳐다보고 있던 문제를 해결하는 데 도움이되었습니다.
— Jordan Parmer 2013 년

정확히 내가 필요한 것.
— smac89

15

http://jsbin.com/esepal/2는 어떻 습니까?

$(document).bind("DOMSubtreeModified",function(){
  console.log($('body').width() + ' x '+$('body').height());
})

이 이벤트는 Mutation Observer API 를 위해 더 이상 사용되지 않습니다.


1
나쁜 생각은 아니지만 얼마나 많은 지원이 있는지 궁금합니다. developer.mozilla.org/en/DOM/DOM_event_reference/…
— Elzo Valugi

특정 요소의 변경 사항을 어떻게 모니터링합니까? 현재 문서는 전체 페이지를 모니터링합니다.
— Patoshi 파트




3

엄격하게 jQuery 대답은 아니지만 디버깅에 대해 언급하는 데 유용합니다.

Firebug에서 DOM 트리의 요소를 마우스 오른쪽 버튼으로 클릭하고 'Break on Attribute Change'를 설정할 수 있습니다.

Break on Attribute Change가 강조 표시된 Firebug에서 요소 오른쪽 클릭

스크립트에서 속성이 변경되면 디버그 창이 나타나고 진행 상황을 추적 할 수 있습니다. 또한 아래에 요소 삽입 및 요소 제거 옵션이 있습니다 (screengrab의 팝업으로 인해 가려지지 않음).


1
이것은 도움이되지만 정확히 그가 요구 한 것은 아닙니다. 이것은 클래스가 변경되거나 스타일 속성이 추가되거나 변경 될 때와 같은 것을 감지합니다. 노드 내부의 내용이 변경되면 확인하지 않습니다. 예를 들어, 일부 자바 스크립트 어딘가에서 노드를 <span> hello </ span>에서 <span> World </ span>로 변경하면이를 감지하지 못합니다
— Joshua Soileau



1

이를 달성하는 간단하고 효과적인 방법은 DOM을 수정하는시기와 위치를 추적하는 것입니다.

DOM 수정을 항상 담당하는 하나의 중앙 함수를 만들어이를 수행 할 수 있습니다. 그런 다음이 함수 내에서 수정 된 요소에 필요한 정리를 수행합니다.

최근 애플리케이션에서는 즉각적인 조치가 필요하지 않았기 때문에 직접 load () 함수에 대한 콜백을 사용하여 수정 된 요소에 클래스를 추가 한 다음 setInterval 타이머로 몇 초마다 모든 수정 된 요소를 업데이트했습니다.

$($location).load("my URL", "", $location.addClass("dommodified"));

그런 다음 원하는 방식으로 처리 할 수 ​​있습니다.

setInterval("handlemodifiedstuff();", 3000); 
function handlemodifiedstuff()
{
    $(".dommodified").each(function(){/* Do stuff with $(this) */});
}

3
이것은 당신이 모든 자바 스크립트를 작성했다고 가정합니다.
— Myster

1

html (또는 임의의) 함수에 콜백 옵션을 추가 할 수 있습니다.

$.fn.oldHtml = $.fn.html;
$.fn.html = function(html,fn){
  fn = fn || function(){};
  var result =  this.oldHtml(html);
  fn();
  return result;
};
$('body').html(11,function(){alert("haha");});

여기에서 데모.

어떤 요소에 대해 변경을 수행합니다. 요소가 포착해야하는 것에 의해 강제로 변경되지는 않습니다.


오늘이 문제를 해결해야했습니다. 타사 라이브러리에 있기 때문에 실제로 html ()을 호출 한 코드를 편집 할 수 없습니다. 이것의 수정 된 버전은 저에게 완벽했습니다. 나는 이것을했다 : $ .fn.oldHtml = $ .fn.html (); $ .fn.html = function (e) {var result = this.oldHtml (e); this.trigger ( 'afterHtmlChange', e);} 이제 모든 요소에서 새로 생성 된 afterHtmlChange 이벤트에 원하는 모든 이벤트를 바인딩 할 수 있습니다.이 이벤트는 jQuery의 html () fn을 호출 할 때마다 실행됩니다.
— Daniel Howard

약간의 실수입니다. 위의 댓글에서 Fn은 다음과 같아야합니다. function (e) {var result = this.oldHtml (e); this.trigger ( 'afterHtmlChange', e); return result;}
— Daniel Howard

0

이벤트에서 요소의 변경을 확인하는 스 니펫을 작성했습니다.

따라서 타사 자바 스크립트 코드 또는 무언가를 사용하고 있으며 클릭했을 때 무언가가 나타나거나 변경되는 시점을 알아야 할 경우 할 수 있습니다.

아래 스 니펫의 경우 버튼을 클릭 한 후 테이블 내용이 변경되는시기를 알아야한다고 가정 해 보겠습니다.

$('.button').live('click', function() {

            var tableHtml = $('#table > tbody').html();
            var timeout = window.setInterval(function(){

                if (tableHtml != $('#table > tbody').
                    console.log('no change');
                } else {
                    console.log('table changed!');
                    clearInterval(timeout);
                }

            }, 10);
        });

의사 코드 :

  • 버튼을 클릭하면
  • 변경하려는 요소의 html이 캡처됩니다.
  • 그런 다음 계속해서 요소의 html을 확인합니다.
  • html이 다를 때 확인을 중지합니다.

0

Mutation Events 를 사용하여이를 달성 할 수 있습니다 . www.w3.org에 따르면, 변형 이벤트 모듈은 속성 및 텍스트 수정을 포함하여 문서 구조의 변경 사항에 대한 알림을 허용하도록 설계되었습니다. 자세한 내용은 MUTATION EVENTS

예 :

$("body").on('DOMSubtreeModified', "#content", function() {
    alert('Content Modified'); // do something
});

이것은 한동안 사용되지 않습니다. 하나는 사용해야합니다 돌연변이 관찰자 (동일한 개념)
— 카를 레스 알콜 레아

-3

불가능합니다. 즉, 콘텐츠 변경 이벤트가 있다고 생각하지만 확실히 x- 브라우저가 아닙니다.

배경에서 쫓아가는 불쾌한 간격 없이는 불가능하다고 말해야할까요!


21
불가능은 아무것도 아닙니다!
— jrharshath 2009
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.