先來(lái)看外部腳本,如果是外部腳本,我們選擇了這樣一種方法,即先創(chuàng )建這個(gè)外部腳本的一個(gè)副本對象,并設置它的 defer 屬性為 true(這一點(diǎn)是為了讓 IE 瀏覽器能正確執行),然后用 appendChild 方法將這個(gè)副本對象插入到 head 中。這里你可能會(huì )問(wèn),為什么不是插入到 innerHTML 所在的對象中呢?插入到 innerHTML 所在的對象中不是更好嗎?如果你試一下就會(huì )知道,如果插入到 innerHTML 所在的對象中,在 IE 瀏覽器中沒(méi)有問(wèn)題,但是在 Mozilla/Firefox 和 Opera 瀏覽器中會(huì )有一些問(wèn)題。問(wèn)題是如果在 Firefox 上這樣做,瀏覽器會(huì )停止響應(這是在 Firefox 1.5 上的測試結果,其他版本是否有此問(wèn)題,尚不得知),而在 Opera 上,腳本會(huì )莫名其妙的執行兩次(這是在 Opera 8.5 上的測試結果,其它版本的 Opera 是否由此問(wèn)題,也尚不得知)。為了避免這些問(wèn)題,所以我選擇了插入到 head 中。
再來(lái)看內部腳本,內部腳本的內容我們可以直接用腳本對象的 text 屬性來(lái)獲取,這里我們使用腳本對象的 text 屬性而不是 innerHTML 屬性,是因為在 Opera 瀏覽器中,腳本對象的 innerHTML 屬性是空的,只有用 text 屬性才能獲取到腳本內容。執行內部腳本直接用 eval 即可。但是腳本可能會(huì )被包含在 HTML 的注釋標簽中,因此我們需要先將注釋標簽去掉,不然在 IE 中會(huì )出錯。