2014-02-10 16 views
0
<script src="first.js"></script> 
<script src="second.js"></script> 

first.js再次呼籲對象的功能在另一個腳本定義

var obj = { 
    id: 1, 
    xyz: function(){ 

    } 
}; 

我想更新的ID和呼叫XYZ功能second.js文件。什麼是最好的方式來做到這一點? 由於腳本將異步加載。

second.js

obj.xyz(); 
+0

他們是如何加載異步?你是否使用懶惰的加載器腳本? –

+0

不,我不是。我猜所有的腳本在頁面上異步加載。 – Yogesh

+2

@Yogesh:不,他們沒有。用你給出的標記,它們同步加載*。 –

回答

1

更新

在關於這個問題的評論,你你不使用任何類型的腳本裝載機的說。這意味着,鑑於您所引用的標記,首先加載並執行first.js,然後加載並執行second.jssecond.js將不會加載並運行,直到first.js(或直到first.js加載失敗)。所以second.js可以做你剛纔所展示的;除非first.js完全無法加載,obj將在那裏等待。基於有關該腳本異步加載要求


原來的答覆

好,最好的辦法是有某種形式的兩者之間的連接或消息的。

但你可以與輪詢。

second.js:

(function() { 
    attempt(); 

    function attempt() { 
     if (typeof obj !== "undefined") { 
      // Got it! 
      obj.xyz(); 
     } 
     else { 
      setTimeout(attempt, 50); 
     } 
    } 
})(); 
+0

輪詢可能不是一個好的解決方案,而OP可以在對象準備好後觸發回調。 – Abhidev

+0

@Abhidev:請參閱原始答案的**第一句**:「嗯,最好的方法是在兩者之間建立某種形式的連接或消息。」* –

-1

在body標籤內的頁面的底部添加我們的所有腳本和腳本運行得很好。如果你仍然不能確定它(沒有理由雖然)您可以將您的JS調用這裏面: -

document.addEventListener('DOMContentLoaded', function() { 
    // your code here 
}, false); 

,或者如果您使用jQuery,你裏面添加這個代碼: -

$(document).ready(function() { 
    //your code 
}); 
+1

這不回答OP詢問的問題。這涉及DOM元素; OP的問題非常清楚地描述了第一個腳本創建的JavaScript對象。絕對不推薦污染全球範圍的 –

0

試圖迫使OBJ定義爲「全球」,在窗口對象定義它

window.obj = { 
    id: 1, 
    xyz: function(){ 
     alert("hey!"); 
    } 
} 

然後調用

window.obj.xyz(); 

obj.xyz(); 
+1

。 – Abhidev

+0

在窗口上直接用'var'定義一個對象也會污染全局範圍 – SparK

相關問題