如何動態加入包含onload回呼函式的script元素
說明
在下面的html
範例中,包含了兩個frame
,分別為headerFrame和contentFrame。 然而,我想要在這份html
管理contentFrame的一些js的全域變數。 可是,我如果放在這份html
文件的head
裡面的話,frame
裡面完全抓不到這些全域變數。 除此之外,如果我要在這些檔案被載入的時候,執行一些自訂的函式又要怎麼做?
1 |
|
作法
一開始,我很單純地以為用document.createElement('script')
就好,沒想到卻沒這麼簡單。 我一共遇到了3個問題:
- 怎麼樣取得contentFrame裡頭的
document
? - 怎樣把建立好了
script
加到該document
裡面? - 如何綁定
onload
的回呼函式,且支援IE7?
Step 1
要怎麼取得frame
裡面的document
物件? 先在window
物件的frames
屬性把contentFrame取出來,再將這個frame
的document
取出來。
1 | var frameDoc = window.frames['contentFrame'].document; |
Step 2
接著,怎麼樣把script
加到document
? 先用document.createElement()
創建一個新的script
元素,並設定這個元素的src
和type
屬性。 然後用frameDoc
物件(contentFrame裡面的document
)的head
屬性提供的appendChild()
方法將元素加到head
裡面去。
1 | var frameDoc = window.frames['contentFrame'].document, |
這邊有另外一個小問題,document.head
這個屬性在IE 9以後才開始支援。 所以要做個簡單的填充工具,利用document.getElementsByTagName()
把head
加到document
中。
1 | var frameDoc = window.frames['contentFrame'].document, |
Step 3
一般來講,onload
會是script
元素的一個屬性,只需把function
指派給這個物件即可。
1 | var frameDoc = window.frames['contentFrame'].document, |
問題又來了,IE 9之後才開始支援DOMContentLoaded。 因此,可以採用script.onreadystatechange()
作為舊版本IE的替代方案。
1 | var frameDoc = window.frames['contentFrame'].document, |
參考資料
document.head - caniuse.com
onload - caniuse.com
Object.onload in Internet Explorer 6, 7 and 8 - StackOverflow