2014-05-10 24 views
1

我正在使用導入功能僅在需要時才導入javascript文件。我的功能如下所示。它們位於main.js文件中,並位於jquery ready包裝器中。當需要和全局變量時導入javascript文件

$(function() { 
    function globaltrigger(){ 
     alert(''); 
    } 

    function $import(src){ 
     var scriptElem = document.createElement('script'); 
     scriptElem.setAttribute('src',src); 
     scriptElem.setAttribute('type','text/javascript'); 
     document.getElementsByTagName('head')[0].appendChild(scriptElem); 
    } 
}); 

比方說,我們導入一個JavaScript文件的鼠標點擊。 $import('newfile.js');。但是,這個新導入的文件無法訪問main.js JavaScript文件中的功能。例如:

// the following function is placed in the newfile.js file 
$(function() { 
    globaltrigger(); 
}); 

任何方法使這項工作?

+1

這應該工作。 'globaltrigger()'真的在全局範圍內,還是被包裝在window.onload或DOM ready中?你會得到什麼錯誤信息? – MrCode

+0

腳本完全加載後是否調用該函數?當你點擊加載是異步的,所以它可能是文件未被完全加載的情況,並且你正在調用函數 –

+0

@MrCode'ReferenceError:globaltrigger未定義'在螢火蟲中。啊,它似乎被包裹在'window.onload'中。 $ import是否與onload一起工作? – pewpewlasers

回答

1

您的問題是我懷疑,globaltrigger()功能不在全球範圍內。它位於jQuery DOM就緒函數內部,因此無法從外部訪問。

將它變成了全球範圍內:

function globaltrigger(){ 
    alert(''); 
} 

$(function(){ 
    // dom ready stuff 
}); 

這是很好的做法,以避免與大量的變量和函數污染全局空間。您可以將函數/變量存儲在一個對象中,這是實現名稱空間的一種簡單方法。

var SomeApp = {}; 

SomeApp.globaltrigger = function(){ 
    alert(''); 
}; 

在外部JavaScript可以稱之爲:

SomeApp.globaltrigger(); 

這是一件好事,因爲你所有的代碼SomeApp對象下生活。

+0

是的,你的邏輯聽起來非常合理。但是,有沒有什麼方法可以在不移動'globaltrigger()'的情況下訪問DOM? – pewpewlasers

+0

不,但如果你擔心污染全球空間,請參閱我的編輯.. – MrCode

+0

看起來不錯!有一個問題,性能明智的做法是將函數保存在窗口對象的下方作爲另一個海報(Amit Joki)建議的還是要有像您這樣的不同對象? – pewpewlasers

1

DOM就緒創建一個閉包,使您的功能僅限於該範圍。你可以聲明你的函數是這樣的全局:

window.globaltrigger = function(){ 
    alert(''); 
} 

現在函數是真正的全局函數,可以被其他腳本調用。

+0

好的,這是一個解決方案。謝謝! – pewpewlasers

+0

@pewpewlasers,很高興有幫助;) –