2013-08-20 27 views
0

我寫了一個小部件,我包括在此類網頁:JavaScript插入腳本與異步並使用它的功能?

<script type="text/javascript"> 
var _sid = '1'; 
    (function() { 
    var se = document.createElement('script'); se.type = 'text/javascript'; se.async = true; 
    se.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://') + 'dev.domain.com/widget/hello.js'; 
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(se, s); 
    })(); 
</script> 

現在我想找到一種方法來調用內部存在hello.js其功能,目前看起來是這樣的:

var widget = function() { 

    function setName(a) { 
     console.log(a); 
    } 

    return widget; 
}(); 

所以我想能夠打電話給setName像這樣:widget.setName("Andy")

...從嵌入式頁面,但由於某種原因,我得到「小部件是未定義的」。

任何想法我做錯了什麼?

+0

Alosyius這是否涉及以任何方式jQuery的 - 不只是批准編輯的,但細看,並拒絕他們,如果他們沒有任何意義! BtT:因爲你加載你的腳本異步,你必須先檢查,如果它已經完成加載。 – Christoph

+0

我不想在任何情況下使用任何jQuery :) – Alosyius

+0

您不附加負載事件處理程序到腳本。當加載事件處理程序運行時,腳本完全可用,您可以調用腳本中定義的函數。 –

回答

1

在你使用小工具,你需要知道它被加載,可以有多種選擇爲:

  1. 使用requireJs或類似的東西。

  2. 在你正在加載的javascript中實現一個回調函數,假設它會觸發'document.onHelloIsLoaded',然後如果你想知道hello是否被加載,只需將該變量設置爲一個函數。

  3. 進行循環,檢查是否設置了小部件變量。的setInterval(當小部件被發現,代碼執行其自動取消)

你也需要做出的setName變量訪問,當你有機會獲得小部件,它現在還不是。你應該把這樣的事情:

var widget = {}; 
widget.setName = function()... 
return widget; 
+0

我將如何實現回調函數?這聽起來像是最好的選擇 – Alosyius

+0

選項3可能不是一個好主意。使用'onload'或IE'readystatechange'並傳遞迴調處理程序。 – Christoph

+4

*「你可以使用while [...]」*否,你不能。這會阻止瀏覽器,因爲JavaScript是單線程的。 –