2013-05-18 28 views
-1

我想在我的项目中使用RequireJs,但是我发现我不能写代码如下如果我使用RequireJs,所有js函数都需要.js文件吗?

<html> 
    <head> 
    </head> 
    <body> 
     <input type="button" /> 
     <script> 
      // Use the jQuery 
      $(function() { 
       //some code 
      } 
      ) 
     </script> 
     <input /> 
     <input /> 

     // I had added the jQuery in required shim and jQuery is working in RequireJs. 
     <script data-main="scripts/main" src="/scripts/require.js"></script> 
    </body> 
</html> 

出现错误$ is undefined,加载页面时。 我抬头看了很多文章,但我解决不了。我该如何处理?我不想将示例js函数移动到.js文件。

+2

include user2361114

+0

否则包含在头部分 – user2361114

+0

如果您不打算在头部脚本标记中使用jQuery,那么您只需要$(document).ready事件侦听器。 然后你可以做'document.addEventListener('DOMContentLoaded',function(){//一些代码})' 如果你想支持

回答

0

第一件事情第一件$在JavaScript中没有任何意义,但被流行的jQuery library使用。 JavaScript !== jQuery

其次,假设您已通过require.js加载jQuery,则需要在 <script data-main="scripts/main" src="/scripts/require.js"></script>之后放置您的初始脚本标记,因为它正在require.js之前调用。

第三,require.js异步加载文件,因此您必须将代码封装在require()define()标记中,并附带一系列依赖关系,以便只在加载后才调用它们。

例如

<html> 
    <head> 
     <script data-main="scripts/main" src="/scripts/require.js"></script> 
    </head> 
    <body> 
     <input type="button" /> 
     <script> 
      /* 
      RequireJS is asynchronous so you must wrap your code 
      in "require(["jQuery"], ...)" so it only calls it once 
      jQuery has been loaded. Each included script is available 
      to you as a parameter in the callback function. 
      */ 
      require(["jQuery"], function($) { 
       $(function() { 
       }); 
      }); 
     </script> 
     <input /> 
     <input /> 
    </body> 
</html> 

您的设置应该是这样的:

requirejs.config({ 
    paths: { 
     'jQuery': 'path/to/jquery' 
    }, 
    shim: { 
     'jQuery': { 
      exports: '$' 
     } 
    } 
}); 
+0

谢谢你的回答。但是,如果js代码缩小,那对我并不好。我必须两次包含jQuery。 'main.js'是一个,在页面中是两个。 – user2306785

+0

@ user2306785这不包括它两次,缩小不影响任何东西(它仍然是相同的代码)。您将它包含在main.js中并使用'require()'告诉您的脚本等待它加载并确保您的代码被正确使用它的范围。你没有加载它两次。 –

+0

如何告诉'require()'在main.js中查找'jQuery'代码,因为所有.js文件都合并为一个文件。 – user2306785

0

您还必须包含jQuery。有一个whole manual page致力于requirejs.org这应该帮助你。

也许你想要的也是解释here。从那里采取:

require(["helper/util"], function(util) { 
    //This function is called when scripts/helper/util.js is loaded. 
    //If util.js calls define(), then this function is not fired until 
    //util's dependencies have loaded, and the util argument will hold 
    //the module value for "helper/util". 
}); 
0

Require.js甚至不实现$。为什么你甚至包装你在$(..)中的功能?

+0

不仅如此,他还在require.js加载之前调用'$()'。 –

+0

当然,但没有requirejs实现$它并不重要 – MofX

+0

对不起,我没有解释我的问题的细节,我想在我的示例代码中使用jQuery。 – user2306785

0

尝试在requirejs脚本标记之后移动示例脚本标记。目前,您的示例函数在requirejs有机会加载jQuery之前执行。

+0

我试图在中移动'',但它不起作用。 – user2306785

+0

我想你需要把你的示例函数也包装在'require([“jquery”],function($){..})'(或者它是'define',我总是让这些混合起来)让requirejs知道你需要jQuery,否则它可以决定不加载它。 –

1

正如你在你的问题中写道:

所有的JS功能需要在.js文件,如果我使用requirejs?

而且随着RequireJS的定义:

RequireJS是一个JavaScript文件和模块加载器。 使用像RequireJS这样的模块化脚本加载器可以提高代码的速度和质量。

所以做这样的插入内嵌<script>代码会在页是不是一个好主意

然而,在回答你的问题,因为RequireJS加载脚本asynchronously,所以你不知道什么时候jQuery将加载,不能使用内嵌脚本老学校,你需要使用definerequire方法为George Reith写在the answer

+0

我认为'定义'不好,你在这里检查:http://requirejs.org/docs/errors.html#mismatch – user2306785

+0

@ user2306785是的,你是对的:) – 2013-05-18 09:12:35

相关问题