2017-09-25 64 views
1

我試圖做一個javascript函數調用另一個.js文件是這樣的:的Javascript麻煩dynammicly調用另一個類在其他js文件

scriptCaller.js 

function callScript(file){ 
    var script = document.createElement('script'); 
    script.id = file; 
    script.type = 'text/javascript'; 
    script.async = true; 
    script.src = "script/"+file+".js"; 
    document.getElementById('scriptSection').appendChild(script); 
} 

然後,我創建了一些類來通過腳本調用其他的文件:

divGenerator.js 

function divGenerator(){ 
    var self = this; 
    var div = document.createElement('div'); 

    this.tag = function(){ 
     return div; 
    } 

    /*and some other function to style the div*/ 

} 

然後我使將要執行的主文件:

main.js 

function build(){ 
    callScript('divGenerator'); 
} 

function main(){ 
    var test = new divGenerator(); 

    /*execute some function to style the div*/ 

    document.getElementById('htmlSection').appendChild(script); 
} 

這三個文件將在HTML文件將執行main函數被調用:如果我改正它應該顯示樣式的div

myPage.html 

<html> 
    <head> 
     <title>myPage</title> 
    </head> 
    <script src="scriptCaller.js"></script> 
    <script src="main.js"></script> 
    <body> 
     <div id="htmlSection"></div> 
     <div id="scriptSection"></div> 
    </body> 
</html> 
<script>build();</script> 
<script>main();</script> 

,但我得到的是一個錯誤,說:

TypeError: divGenerator is not a constructor[Learn More] 

但是,當我將divGenerator()類移動到myPage.html它工作正常。任何想法來解決這個問題?

+0

從瀏覽器的控制檯,您可以分享哪一行拋出這個錯誤? 'TypeError:Container不是構造函數[瞭解更多內容]' – gurvinder372

+0

@ gurvinder372它在main.js中說:10:13。聲明var test = new divGenerator()的行; – user2265229

+0

哪一行,提到具體行 – gurvinder372

回答

0

在代碼中有幾個問題。首先,不要將id分配給與「導出」全局構造函數名稱相同的腳本元素。你需要記住id屬性(和name)的任何東西都會自動暴露爲window對象上的全局變量。這意味着您的案例中的divGenerator將引用HTMLScriptElement,而不是構造函數。

第二個問題與計時有關,因爲您正在使用async屬性加載腳本。這很好,但是你需要認識到,在這種情況下,當你在build()之後調用main時,不能指望該腳本將被加載。我建議創建腳本包裝成承諾:

function callScript(file){ 
    return new Promise(function(resolve) { 
     var script = document.createElement('script'); 
     script.id = 'script-' + file; // Note different id 
     script.async = true; 
     script.src = "script/" + file + ".js"; 
     script.onload = resolve 

     document.getElementById('scriptSection').appendChild(script); 
    }) 
} 

,並使用它像這樣:

<script> 
    build().then(function() { 
    main(); 
    }) 
</script> 
+0

Aww ..出現新錯誤。它說TypeError:build(...)是未定義的[瞭解更多]。 – user2265229

+0

您仍然需要包含'',其中'build'被定義。 – dfsq

+0

我不刪除它.. – user2265229

1

您需要將scriptCaller.jsdivGenerator.js添加到您的html腳本元素中。

<html> 
    <head> 
     <title>myPage</title> 
    </head> 
    <script src="scriptCaller.js"></script> 
    <script src="main.js"></script> 
    <script src="scriptCaller.js"></script> 
    <script src="divGenerator.js"></script> 
    <body> 
     <div id="htmlSection"></div> 
     <div id="scriptSection"></div> 
    </body> 
</html> 
<script>build();</script> 
<script>main();</script> 
+0

你不明白這個問題。 – dfsq