スクリプトが jQuery に依存している場合は非常に簡単です$.holdReady()
。オブザーバーがリッスンするまで、準備完了イベントの発生を遅らせるだけです。
HTML:
<h1>Sample title</h1>
<p>Sample paragraph</p>
J:
$(function() {
$('body').append("<p>Foo</p>").append("<p>Bar</p>");
});
(function() {
$.holdReady(true);
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
console.log(mutation.type);
});
});
var target = document.querySelector('html');
var config = {
childList: true,
attributes: true,
subtree: true,
characterData: true
};
setTimeout(function() {
observer.observe(target, config);
$.holdReady(false);
}, 1);
}());
上記のように、他のスクリプトが ready イベントにバインドする場所に関係なく、これは機能します。
ただし、言うまでもなく、他のスクリプトが jQuery に依存していると想定することは、常に当てにできるものではありません。それとは関係なく機能するソリューションを探している場合は、注意が必要です。
HTMLは以前のままです。ボディの最後に
Js :
$(function() {
$('body').append("<p>Foo</p>").append("<p>Bar</p>");
});
(function() {
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
console.log(mutation.type);
});
});
var target = document.querySelector('html');
var config = {
childList: true,
attributes: true,
subtree: true,
characterData: true
};
observer.observe(target, config);
}());
期待される機能を得るには、このスクリプト ブロックが本文の最後にある絶対的な最後のスクリプト ブロックであることを確認してください。これにより、すべての静的 DOM が既に存在し、正しい時間にリッスンを開始できることが保証されます。
load または ready イベントが発生した後に、他のすべてのスクリプトが DOM の変更を開始すると想定しています。そうでない場合は、それに応じてスクリプト ブロックを移動し、このスクリプトが DOM 解析の最後に起動し、他のスクリプトがこのスクリプトの後に起動するようにします。
これを完全にテストしたわけではありませんが、これで始められるはずです。