2009-02-09 37 views
1

我想給隨機網站一個最小的js代碼,以便他們可以添加一個小部件。如何添加一個帶參數的外部js文件

代碼需要在主頁面加載後運行,幷包含帶域名的參數。 (我不想硬編碼)

一個選項只是</body>前添加以下代碼(所以它會在頁面加載後運行):

<script type="text/javascript" id="widget_script"> 
    document.getElementById('widget_script').src=location.protocol.toLowerCase()+"//mywebsite.com/?u="+encodeURIComponent(window.location.host);   
</script> 

這在IE,但不是在Firefox瀏覽器。我用Firebug看到src屬性是正確創建的,但我的站點中的腳本未加載。

我的問題是:什麼是最好的辦法呢? (最好通過在標題部分放最少的行)。

爲了進一步澄清問題:如果我在標題部分放置腳本,如何在加載並加載主頁後使其運行?如果我在腳本中使用onload事件,我可能會錯過它,因爲它可能在onload事件被觸發後加載。

回答

0

您可能想要實施非阻塞腳本技術。基本上不是修改腳本的src,而是創建並追加一個全新的腳本元素。

寫得很好here在YUI和jQuery中有這樣的標準方法。這很簡單,只有一個很好理解的陷阱(並在該鏈接中記錄)。

哦,這樣的:

一種選擇就是 的</body>前添加以下代碼(所以它將運行在頁面加載後 ):

...是不是技術上真:你只是把你的腳本作爲加載順序中的最後一件事。

+0

感謝您的推薦! 這種技術似乎是一種矯枉過正,我不確定瀏覽器的兼容性。 我的目標不是加載速度更快,而是在頁面加載後訪問以訪問原始頁面上的信息 – Nir 2009-02-09 11:04:09

+0

我知道:但此技術也可以解決您的問題。就xbrowser而言,唯一的問題是firefox有一個奇怪的計時器問題,這就是setTimeout部分解決的問題。這可能是你甚至不需要這個。 – annakata 2009-02-09 11:35:34

+0

該鏈接現在已關閉,無法獲得答案。這正是爲什麼你發佈多個鏈接到stackoverflow並複製/粘貼/阻止鏈接的答案。 – 2014-05-12 00:40:44

1

爲什麼不使用jQuery的getScript方法來加載?如果你不想依賴jQuery,你可以trace through the source來了解他們如何處理它。

查看廣泛使用的庫總是會告訴你解決方案,你不知道你有問題。例如,您可以看到jQuery在加載腳本時如何管理生成回調,以及如何避免IE中聲稱的內存泄漏。

2

您可以嘗試靜態地將文檔包含在腳本中。寫(是一個老技術,不建議使用,因爲它可能會導致更多的現代圖書館的問題):

var url = location.protocol.toLowerCase() + 
    "//mywebsite.com/?u="+encodeURIComponent(window.location.host); 
document.write('<script src="', url, '" type="text/javascript"><\/script>'); 

或者與動態創建的DOM元素:

var dynamicInclude = document.createElement("script"); 
dynamicInclude.src = url; 
dynamicInclude.type = "text/javascript"; 
document.getElementsByTagName("head")[0].appendChild(dynamicInclude); 

後來編輯:

爲確保腳本在onload後運行,可以使用:

var oldWindowOnload = window.onload; 
window.onload = function() { 
    oldWindowOnload(); 
    var url = location.protocol.toLowerCase() + 
     "//mywebsite.com/?u="+encodeURIComponent(window.location.host); 
    var dynamicInclude = document.createElement("script"); 
    dynamicInclude.src = url; 
    dynamicInclude.type = "text/javascript"; 
    document.getElementsByTagName("head")[0].appendChild(dynamicInclude); 
} 

我不是相信它可以比這短,除了較短的變量名稱:)

相關問題