將模組ID與factory關聯在一起的新思路

weixin_34219944發表於2012-12-16

這是利用到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)

相關文章