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.