Document.ready在外部文件中?

时间:2011-07-01 12:22:25

标签: javascript jquery

我在HTML页面上引用JavaScript如下:

<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中),是否仍然可以安全地假设{{1}中定义的函数有空吗?

  3. 最后,我是不是将shared.js内的shared.js包装成问题?我发现如果我将它包装起来,它的功能将不再适用于页内代码。

  4. 问题3的原因是我遇到了这个问题:Uncaught TypeError: Property ... is not a function - after page has loaded

    并想知道这是否与我如何组织代码有关。

    更新:感谢您的回答。现在很清楚,在shared.js中使用$('document').ready会从全局范围中删除这些函数。但是,我只想澄清第3点中的原始问题。

    如果我执行以下操作,我可以假设:

    • 在我的页内代码中,在$('document').ready内加载,从shared.js调用函数
    • 让shared.js中的函数引用jQuery,Google Maps或我页面上的元素

    没有问题吗?

    换句话说,即使我没有将$('document').ready内的所有内容都包含在shared.js内的文件中,是否可以安全地假设页面将在调用$('document').ready内的函数时加载?

5 个答案:

答案 0 :(得分:25)

  

可以安全地假设shared.js中定义的函数可用于“页内代码”吗?

是的,只要这些功能被注入全球范围

  

如果我将页内代码拉出到一个名为local.js的单独文件中(将其保存在$('document')。ready中),是否可以安全地假设shared.js中定义的函数可用?

是的,只要在local.js AND 之后包含shared.js,shared.js就会将函数注入全局范围。

  

最后,事实是我没有在$('document')中包装shared.js。准备好了吗?我发现如果我把它包装起来,它的功能就不再适用于页内代码了。

document.ready中包装函数会使它们超出全局范围。

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

您需要在全局范围内注入变量,这就像执行

一样简单
$(function() {
  /* all your code */

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

答案 1 :(得分:3)

  1. 也许。如果将代码包装在函数中,您将失去对定义的函数的全局访问。在大多数情况下,这是一件好事 - 不会污染全局命名空间。您仍然可以在全局命名空间中访问这些函数,而不是function foo(){} window.foo = function(){};
  2. 然而,这一切都无关紧要,因为您需要一个dom ready侦听器或者您不需要 - 取决于您是否尝试访问该代码中的dom。如果是,则将其包装,如果没有,则不要。如上所述,无论哪种方式,您都可以关闭代码,以免污染全局命名空间,或者如果您愿意,可以污染它。

答案 2 :(得分:1)

  1. 可以安全地假设(如果定义未隐藏在无法访问的闭包内)。

    //shared.js
    function DoThis() {}
    function DoThat() {}   
    
  2. 它仍然有效,只需在local.js

    之后嵌入shared.js
    <script type="text/javascript" src="js/shared.js"></script>
    <script type="text/javascript" src="js/local.js"></script>
    
  3. 它不起作用,因为函数被包装在一个闭包中(将在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内容或者在页面加载后应该完成的任何事情)。

答案 3 :(得分:0)

  

最后,事实是我不是   将shared.js包装在里面   $('文件')。准备好了吗?我   发现如果我把它包起来的话   函数不再可用   页内代码。

如果将函数包装在document.ready中,那么这些函数在全局范围内不可用,因为函数具有局部范围(包含它们的函数内的I.E)

答案 4 :(得分:0)

您提供的代码组织很好。 “shared.js”中定义的所有功能都可用于您网页的其余部分,包括$('document').ready(function()阻止。

但是,如果将函数放在该块中的shared.js 中,则将代码的范围限制为$('document').ready(function()(即页面中没有其他内容可以使用它) - - 如果你想让“shared.js”中的东西可用于代码/应用程序的其他部分,那么这就不是你想要的了。