これは確かにハックですが、ノードを挿入するために使用される基礎となる DOM メソッドにパッチを当ててみませんか? これを行うには、いくつかの方法があります。
A. _ 特定の要素が追加されることはわかっています。
var c = document.getElementById('#container');
c.__appendChild = c.appendChild;
c.appendChild = function(){
alert('new item added');
c.__appendChild.apply(c, arguments);
}
A のフィドル デモ
B. _ どのタイプの要素が追加されるかはわかっています。
HTMLDivElement.prototype.__appendChild = HTMLDivElement.prototype.appendChild;
HTMLDivElement.prototype.appendChild = function(){
alert('new item added');
HTMLDivElement.prototype.__appendChild(this,arguments);
}
Bのフィドルデモ
(ソリューションBは、IE < 8
または DOM プロトタイプをサポートしていない他のブラウザーではサポートされていないことに注意してください。)
これと同じ手法をinsertBefore
、replaceChild
やなどのすべての基になる DOM ミューテーション関数で簡単に使用できますremoveChild
。
それが一般的な考え方です。これらのデモは、他のほとんどすべてのユースケースに適応できます。たとえば、広いネットをキャストして、タイプに関係なくすべての追加をキャッチし、すべてのブラウザーで動作することを確認したいとします。(下記の例 C を参照)IE < 8
アップデート
C. DOM を再帰的にウォークし、すべての要素の関数を交換してコールバックをトリガーし、追加されるすべての子に同じパッチを適用します。
var DOMwatcher = function(root, callback){
var __appendChild = document.body.appendChild;
var patch = function(node){
if(typeof node.appendChild !== 'undefined' && node.nodeName !== '#text'){
node.appendChild = function(incomingNode){
callback(node, incomingNode);
patch(incomingNode);
walk(incomingNode);
__appendChild.call(node, incomingNode);
};
}
walk(node);
};
var walk = function(node){
var i = node.childNodes.length;
while(i--){
patch(node.childNodes[i]);
}
};
patch(root);
};
DOMwatcher(document.body, function(targetElement, newElement){
alert('append detected');
});
$('#container ul li').first().append('<div><p>hi</p></div>');
$('#container ul li div p').append('<a href="#foo">bar</a>');
Cのフィドル デモ
更新 2
ティム・ダウンがコメントしたように、上記のソリューションは、 ではなく、またはをサポートしていないため、 では機能しませIE < 8
ん。もし. _appendChild
Function
call
apply
setInterval
typeof document.body.appendChild !== 'function'