とりあえず、in-browser の babel で DOMContentLoaded 引っ掛けるにはどうするのが推奨なのだろう?
こうかな?
<script type="text/babel">
(proc => window.readyState !== 'loading' ? proc() : window.addEventListener("DOMContentLoaded", proc))(()=>{
let div = document.createElement("div");
div.textContent = "hello, world";
document.body.appendChild(div);
});
</script>
動くけど、折角の Arrow Function でコンパクトに書いたのが台無し感高い。
他にも DOMContentLoaded 引っ掛けてるやつがいると、二重に実行されそうでよろしくないのだが、
readyState を見て、イベントを発行し直すコードを末尾に入れるという手は使えそう。
<script type="text/babel">
document.addEventListener("DOMContentLoaded", ()=>{
let div = document.createElement("div");
div.textContent = "hello, world";
document.body.appendChild(div);
});
document.readyState !== 'loading' && document.dispatchEvent(new Event("DOMContentLoaded"));
</script>
一応 Firefox では動くんだけど、
IE11 は new Event() が出来ないらしく
SCRIPT445: このオブジェクトではサポートされていない操作です。
と言われてエラーになってしまう。
「
IE11 new Event()」でググってみると以下のページを見つけた。
new Event() 失敗した時用に fallback 用意しとけばどうにかなりそう?
一応
function newEvent(event) {
var e;
try {
e = new Event(event);
} catch(ex) {
e = document.createEvent("Event");
e.initEvent(event, false, true);
}
return e;
}
document.readyState !== 'loading' && document.dispatchEvent(newEvent("DOMContentLoaded"));
とすれば、IE11 でも動いたが、これを追加するのはやっぱり台無し感が高い。
いっそ、
<script type="text/babel">
function onload(){
let div = document.createElement("div");
div.textContent = "hello, world";
document.body.appendChild(div);
}
</script>
<script>
document.addEventListener("DOMContentLoaded", function(){
onload ? onload() : setTimeout(arguments.callee, 10);
})
</script>
のように、babel 側処理終わるまで、素の JavaScript の方で待たせるのも手かな?と思ったが、Arrow Function 消えてしまってるので、これはこれで本末転倒感が高いし、setTimeout のループで関数定義待ってるのもなんかダサいな。