jquery detection 특정 클래스의 div가 DOM에 추가되었습니다.
사용하고 있습니다..on()
페이지가 로드된 후 생성되는 div의 이벤트를 바인딩합니다.클릭할 때는 잘 작동합니다. 마우스 입력...그런데 언제 내 클래스의 디브가 새로 추가되었는지 알고 싶습니다.나는 이것을 찾고 있습니다.
$('#MyContainer').on({
wascreated: function () { DoSomething($(this)); }
}, '.MyClass');
이거 어떻게 해요?플러그인 없이 앱 전체를 쓸 수 있었고 그렇게 유지하고 싶습니다.
감사해요.
이전에는 jQuery의 것을 연결할 수 있었습니다.domManip
모든 jQuery dom 조작을 잡고 삽입된 곳에 어떤 요소가 있는지 확인하는 방법입니다. 그러나 jQuery 팀은 일반적으로 jQuery 방법에 그런 방식으로 연결하는 것은 좋은 솔루션이 아니기 때문에 jQuery 3.0+에서 종료했습니다. 그리고 그들은 그것을 내부적으로 만들었습니다.domManip
method는 코어 jQuery 코드 밖에서는 더 이상 사용할 수 없습니다.
돌연변이 이벤트 또한 이전과 마찬가지로 다음과 같은 것을 할 수 있었습니다.
$(document).on('DOMNodeInserted', function(e) {
if ( $(e.target).hasClass('MyClass') ) {
//element with .MyClass was inserted.
}
});
이것은 피해야 하며, 오늘날 돌연변이 관찰자가 대신 사용되어야 하며, 이것은 이렇게 작동할 것입니다.
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
console.log(mutation)
if (mutation.addedNodes && mutation.addedNodes.length > 0) {
// element added to DOM
var hasClass = [].some.call(mutation.addedNodes, function(el) {
return el.classList.contains('MyClass')
});
if (hasClass) {
// element has class `MyClass`
console.log('element ".MyClass" added');
}
}
});
});
var config = {
attributes: true,
childList: true,
characterData: true
};
observer.observe(document.body, config);
다음은 jquery.initialize를 정확하게 수행하는 내 플러그인입니다.
사용법은 당신이 사용하는 것과 동일합니다..each
기능은 하지만, 기능은.initialize
원소에 대한 함수, 다음과.each
AJAX 등과 함께 추가하더라도 추가 코드 없이 향후 추가되는 요소도 초기화됩니다.
initialize 는 .each function 과 정확히 동일한 구문을 갖습니다.
$(".some-element").initialize( function(){
$(this).css("color", "blue");
});
그러나 이제 새 요소 일치 .some-element selector가 페이지에 나타나면 즉시 초기화됩니다.새로운 아이템을 추가하는 방식은 중요하지 않으며, 콜백 등은 신경쓰지 않아도 됩니다.
$("<div/>").addClass('some-element').appendTo("body"); //new element will have blue color!
플러그인 기반:MutationObserver
이것과 다른 여러 게시물을 검토한 후, 저는 제가 생각하기에 각각 최고라고 생각하는 것을 단순한 것으로 증류하여 한 종류의 요소가 삽입되었을 때 감지하고 그 요소에 작용하도록 했습니다.
function onElementInserted(containerSelector, elementSelector, callback) {
var onMutationsObserved = function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes.length) {
var elements = $(mutation.addedNodes).find(elementSelector);
for (var i = 0, len = elements.length; i < len; i++) {
callback(elements[i]);
}
}
});
};
var target = $(containerSelector)[0];
var config = { childList: true, subtree: true };
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var observer = new MutationObserver(onMutationsObserved);
observer.observe(target, config);
}
onElementInserted('body', '.myTargetElement', function(element) {
console.log(element);
});
중요한 것은 a) 대상 요소가 "addedNode" 내의 모든 깊이에 존재할 수 있도록 하고 b) 처음에 삽입될 때만 요소를 처리할 수 있도록 한다는 것입니다(전체 문서 설정을 검색하거나 "이미 처리된" 플래그를 무시할 필요가 없음).
3년의 경험 후, 이것은 내가 "DOM에 추가된 특정 클래스의 요소"를 듣는 방식입니다: 당신은 단순히 jQuery에 후크를 추가합니다.html()
함수는 다음과 같습니다.
function Start() {
var OldHtml = window.jQuery.fn.html;
window.jQuery.fn.html = function () {
var EnhancedHtml = OldHtml.apply(this, arguments);
if (arguments.length && EnhancedHtml.find('.MyClass').length) {
var TheElementAdded = EnhancedHtml.find('.MyClass'); //there it is
}
return EnhancedHtml;
}
}
$(Start);
Query를 사용하는 경우에는 작동합니다.그리고 브라우저별 이벤트에 의존하지 않습니다.DOMNodeInserted
호환되지 즉, 이 이 저는 n에 대해서도 하였습니다..prepend()
전반적으로, 이것은 저에게 매력적이고, 당신에게도 희망적입니다.
돌연변이 사건을 이용할 수 있습니다
http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-mutationevents
편집
MDN: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events
사용하지 않음 이 기능은 웹에서 제거되었습니다.일부 브라우저는 여전히 이를 지원할 수 있지만 삭제 절차를 밟고 있습니다.기존 또는 신규 프로젝트에서는 사용하지 마십시오.그것을 사용하는 페이지나 웹 앱은 언제든지 깨질 수 있습니다.
돌연변이 관찰자는 DOM4의 돌연변이 이벤트를 대체하기 위해 제안된 것입니다.그것들은 파이어폭스 14와 크롬 18에 포함될 것입니다.
https://developer.mozilla.org/en/docs/Web/API/MutationObserver
MutationObserver
대응하는 합니다. DOM의 변화에 대응하는 방법을 제공합니다.DOM3 Events 사양에 정의된 Mutation Events를 대체하기 위해 설계되었습니다.
용례
다음 예시는 http://hacks.mozilla.org/2012/05/dom-mutationobserver-reacting-to-dom-changes-without-killing-browser-performance/ 에서 가져온 것입니다.
// select the target node
var target = document.querySelector('#some-id');
// create an observer instance
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
console.log(mutation.type);
});
});
// configuration of the observer:
var config = { attributes: true, childList: true, characterData: true };
// pass in the target node, as well as the observer options
observer.observe(target, config);
// later, you can stop observing
observer.disconnect();
아드님의 답변에 두 가지가 더 추가되었습니다.
(1) 우리는 라인을 바꿀 수 있습니다.
return el.classList.contains('MyClass');
로.
if( el.classList ) {
return el.classList.contains('MyClass');
} else {
return false;
}
그래서 우리는 볼 수 없을 것입니다."Uncaught TypeError: Cannot read property 'contains' of undefined"
오류를 범실.
(2) 보탠다subtree: true
인에config
추가된 모든 요소에서 추가된 노드를 재귀적으로 찾습니다.
언급URL : https://stackoverflow.com/questions/10415400/jquery-detecting-div-of-certain-class-has-been-added-to-dom
'programing' 카테고리의 다른 글
Mysql/MariaDB 트리거 문제 및 디버그 (0) | 2023.09.06 |
---|---|
mariadb에서 버려진 연결 정리(mysql과 비교)? (0) | 2023.09.06 |
python에서 클래스의 모든 멤버 변수를 루핑 (0) | 2023.09.06 |
Microsoft SQL Server 2000의 MySQL LIMIT 절 에뮬레이트 (0) | 2023.09.06 |
PSCustomObject가 아닌 원시 형식(예: String)을 반환하도록 Select-Object를 가져오는 방법은 무엇입니까? (0) | 2023.09.06 |