MutationObserver
apiを使用すると、DOM
の変更を検出できます。
ここでは、ブラウザが希望の内容に基づいてDom Changed
イベントをトリガーするかどうかを確認するための例を示します。
ここでは、jqueryのtext('...')
と、jqueryを使用しないel.textContent
の両方があります。クロム55で
$(document).ready(function() {
$('#btn1').click(function() {
console.log('text changed - jquery');
$('#a1').text('text 1');
});
$('#btn2').click(function() {
console.log('text changed - textContent');
$('#a1')[0].textContent = $('#a1')[0].textContent
});
$('#btn3').click(function() {
console.log('class changed');
$('#a1').attr('class', 'cls' + Math.floor(Math.random() * 10));
});
});
var target = $('#a1')[0];
// create an observer instance
var observer = new MutationObserver(function(mutations) {
var changed = false;
mutations.forEach(function(mutation) {
// You can check the actual changes here
});
console.log('Dom Changed');
});
// 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);
.cls1 {
border: 1px solid red;
}
.cls2 {
border: 1px solid pink;
}
.cls3 {
border: 1px solid cyan;
}
.cls4 {
border: 1px solid darkgreen;
}
.cls5 {
border: 1px solid orange;
}
.cls6 {
border: 1px solid darkred;
}
.cls7 {
border: 1px solid black;
}
.cls8 {
border: 1px solid yellow;
}
.cls9 {
border: 1px solid blue;
}
.cls10 {
border: 1px solid green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="a1" class="cls1">text 1</div>
<button id="btn1">Change text - jquery (keep original)</button><br />
<button id="btn2">Change text - textContent (keep original)</button><br />
<button id="btn3">Change class (real change)</button>
- 、のみ
setAttribute()
とjQuery text()
はDom Change
イベントをトリガしました。
- Firefox 50では、すべてが
Dom Change
イベントをトリガーしました。
- Edge 38では、すべてが
Dom Change
イベントをトリガーしました。
現在のところ、ブラウザは非常にスマートです。変化がなければリフローは起こらず、賢明に表示されます。その場合でも、再描画は影響を受ける画面の部分にのみ適用されます。 –
*私はスペースを無駄にしています*はい、スペースは最近の保険料になります、私のデスクトップは32GBのRAMしか持っていません。 –
@ torasaburo大規模なSPAのすべてのバインドされた値のコピーを保持することは、モバイルデバイスでは高価です。頻繁に変更すると、収集する必要があるゴミがたくさん生成され、フレームレートが狂ってしまいます。それは大きな効果ではありませんが、それを行う際にゼロ点がある場合、まだここで勝つために何かがあるかもしれません。 – Anders