這是利用到jquery團隊在IE6-8中新增HTML5新標籤中的一個hack!
function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; }
但到IE9後文件碎片就沒有createElement方法了。但我們可以改成document.createElement("script")實現。
但到IE10後如果文件碎片不插入DOM樹,就不會發出請求,這個與其他標準瀏覽器的行為一致。因此與瀏覽器搏鬥真是消耗戰啊,人家可以持續升級,把你焦頭爛額搞鼓出來的hack秒殺。
IE的問題在於先parse不一定先onload,加之IE早期的onload是用onreadystatechange 模擬的。另外,IE6還有base標籤這東西作崇,逼使我們以倒序插入(insertBefore)。
var frag = document.createDocumentFragment() var script = frag.createElement('script') frag.moduleID = "lang" script.onreadystatechange = function(){ console.log(this.parentNode.nodeType);//11 console.log(this.parentNode.moduleID);//lang //得到模組ID,然後將它與lang.js中的factory繫結在一起 document.getElementsByTagName("head")[0].appendChild(frag) } script.src = 'lang.js'; frag.appendChild(script)