2011-07-01 35 views
11

我引用JavaScript的HTML頁面上進行如下:Document.ready在外部文件中?

<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script> 
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js"></script> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&amp;region=GB"></script> 
<script type="text/javascript" src="js/shared.js"></script> 
<script type="text/javascript"> 
$('document').ready(function() { 
    // In-page code: call some functions in shared.js 
}); 
</script> 

在shared.js定義的函數不是包裹在裏面$('document').ready。所以:

  1. 它是安全的假設,在shared.js定義的函數都可以以「在頁面代碼」?

  2. 如果我拉出在頁面代碼到名爲local.js一個單獨的文件(保持它包裹在$('document').ready),它仍然是安全的假設,在shared.js定義的功能有哪些?

  3. 最後,是不是我在$('document').ready裏面包裝shared.js有問題?我發現如果我包裝它,它的功能將不再可用於頁內代碼。

原因問題3的是,我打這個問題:Uncaught TypeError: Property ... is not a function - after page has loaded

,並想知道是否是與我是如何組織我的代碼。

更新:感謝您的答案。現在很清楚,在shared.js中使用$('document').ready會從全局範圍中刪除這些函數。不過,我只是想澄清一點原來的問題3.

我可以假設,如果我做到以下幾點:

  • 內我的頁面代碼,裏面裝$('document').ready,調用從共享功能.JS
  • 在shared.js功能是指jQuery的,谷歌地圖,或元素在我的網頁

不會有問題呢?

換句話說,假設頁面在調用shared.js內部函數的時候已經加載,即使我沒有在$('document').ready中包含該文件中的所有內容,也安全嗎?

回答

24

假設shared.js中定義的函數可用於「頁內代碼」是否安全?

是的,只要這些功能被注入到全球範圍

如果我拉出在頁面代碼到一個名爲單獨的文件local.js(保持它包裹在$('文件').ready),假設在shared.js中定義的函數可用,是否仍然安全?

是的,只要local.js之後shared.js shared.js包括注入功能整合到全球範圍。

最後,事實是我沒有將shared.js包裝到$('document')裏面。準備好了一個問題?我發現如果我包裝它,它的功能將不再可用於頁內代碼。

document.ready中的環繞功能使它們在全局範圍之外。

var foo = 4; // global 
$(function() { 
    var bar = 5; // local 
}); 
foo = bar; // error 

你需要注入在全球範圍內的變量,這是因爲這樣做容易

$(function() { 
    /* all your code */ 

    window["SomeGlobalVariable"] = someFunctionIWantGlobal; 
}); 
+0

+1很好的解釋 – kapa

1
  1. 它是安全的假設(如果定義不隱藏封閉不能在裏面訪問)。

    //shared.js 
    function DoThis() {} 
    function DoThat() {} 
    
  2. 它仍然可以工作,後shared.js

    <script type="text/javascript" src="js/shared.js"></script> 
    <script type="text/javascript" src="js/local.js"></script> 
    
  3. 它沒有工作只是嵌入local.js,因爲這些功能都被包裹在一個閉包(將在domready中運行的一個),所以它們僅在關閉時可用

    $(document).ready(function() { //this is a closure! 
        function DoSg() {} 
        //DoSg is only available inside the closure 
        //cannot be accessed from the outside, it's defined inside 
    }); 
    

    此外,無需將函數定義放入$(document).ready()。重要的部分是當你調用這些函數,這應該在.ready()(嗯,如果它涉及DOM的東西或任何應該在頁面加載後應該完成)。

0

最後的事實是,我在裏面 $( '文件')。準備一個問題不 包裝shared.js?我是 ,發現如果我包裝它,其 函數不再可用於 頁內代碼。

如果你包裏面的document.ready這些功能的功能都沒有在全球範圍內可用,功能具有本地範圍(IE在那裏它們被包含在函數內部)

1
  1. 是的
  2. 也許吧。如果你在一個函數中包裝代碼,你將失去對定義函數的全局訪問。大多數情況下這是一件好事 - 不會污染全局名稱空間。您仍然可以在全局名稱空間中訪問這些函數,而不是function foo(){},而是window.foo = function(){};

但是,這一切都不相關,因爲你需要一個dom準備好的監聽器,或者你不需要 - 取決於你是否試圖訪問該代碼中的dom。如果是的話,那就把它包起來,如果沒有的話,那就不要。如前所述,無論哪種方式,您都可以關閉您的代碼,以免污染全局名稱空間,或者如果您願意的話會污染它。

+0

+1 '.ready'只包含在DOM操作代碼中。 – Raynos

0

您的代碼組織沒有問題。在「共享」中定義的任何功能。JS」將提供給你的頁面的其餘部分,包括你的$('document').ready(function()塊。

但是,如果您將功能shared.js 阻斷,那麼你就限制了代碼的範圍爲$('document').ready(function()(即無否則在頁面中可以使用它) - 如果你想讓「shared.js」中的東西可用於代碼/應用程序的其他部分,那麼這不是一種好的方法。

+0

**這是要走的路!**最好_specifically_注入任何你想成爲全局的窗口' – Raynos

+0

我的意思是說,這將無法工作_與他的海報hared.js file_,正如他發現的那樣。我會更新我的措辭以使其更清楚。 – Ben

+0

我仍然建議隱藏所有的功能,並且只是專門向全局範圍注入需要全局化的內容,而不是默認情況下將所有內容全部泄露到全局範圍。 – Raynos