2

我想开始使用道场。

因此我使用他们的教程:http ://dojotoolkit.org/documentation/tutorials/1.8/hello_dojo/

最简单的教程显示这个页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Tutorial: Hello Dojo!</title>
</head>
<body>
    <h1 id="greeting">Hello</h1>
    <!-- load Dojo -->
    <script src="//ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js"
               data-dojo-config="async: true"></script>
</body>
</html>

我现在打开页面(在他们的页面上尝试了本地和托管版本)。当我写

dojo.query("h1")

在我的萤火虫控制台中,我收到消息:

ReferenceError: dojo 未定义

请帮忙

4

4 回答 4

7

这个问题缺乏正确的答案。这不起作用的原因是您启用了async模式。这实际上做的是 Dojo 核心将被异步加载。

Dojo 核心是加载文件时自动加载的 Dojo 的一部分dojo.js。它设置了一个名为的全局变量dojo,其中包含dojo.query部件等基本功能。

您的问题是您实际上并没有等待核心加载。因为核心未加载,dojo将是undefined,给你那个错误。


您应该只async在使用 AMD 加载程序 ( require()) 时使用模式,如果您不想使用它(传统模式),您只需asyncfalse. 但这种模式实际上已被弃用,将在 Dojo 2.0 中删除。

另一种解决方案是使用 AMD 加载器(异步模块加载器),正确的语法是:

require([ "dojo/query" ], function(query) {
    query("h1");
});

在此示例中,您可能有机会尚未加载 DOM,因此最好的答案是等待 DOM 也加载,结果是:

require([ "dojo/query", "dojo/domReady!" ], function(query) {
    query("h1");
});

当您使用协议隐含 URL 时,您表示它正在工作。然而,事实并非如此。它突然起作用的唯一原因是因为您离开了该async属性,默认为false.

克里斯托弗所说的不同,传统模式仍然可用,但已被弃用。

艾格尼丝的回答会起作用,因为它使用的是 AMD 加载程序。但是,将遗留代码和新语法结合起来看起来并不好。如果您选择 AMD,则应将所有内容都放入 AMD,而不仅仅是某些部分。

于 2014-02-03T13:24:53.970 回答
3

由于之前没有 Dojo 的经验,我阅读了一些文档。尤其是这部分,讲的是“现代道场”。

事实证明,从 1.7 版开始,您不能再仅仅加载 dojo.js 并期望调用dojo.something. 有了“新道场”,就再也不可能了。这就是你得到dojo is not defined.

有关更多信息,请阅读有关如何开始的更新文档,但这里有一个简单的 hello world:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Tutorial: Hello Dojo!</title>
    <link rel="stylesheet" href="../../../resources/style/demo.css">
</head>
<body>
    <h1 id="greeting">Hello</h1>
    <!-- load dojo and provide config via data attribute -->
        <script src="//ajax.googleapis.com/ajax/libs/dojo/1.8.3/dojo/dojo.js" data-dojo-config="isDebug:1, async:1"></script>
    <script>
        require(["dojo/dom", "dojo/domReady!"], function(dom){
            var greeting = dom.byId("greeting");
            greeting.innerHTML += " from Dojo!";
        });
    </script>
</body>
</html>

如果您喜欢使用旧方式,我想您可以参考 1.7 之前的 Dojo 版本,但使用旧版本很少是一种好的方式,因此我建议您学习新的做事方式。

于 2013-01-30T07:51:38.053 回答
3
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Title</title>
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.9.1/dojo/dojo.js" data-dojo-   config="async: true"></script>
</head>

<body>

<script>
require(["dojo"], function(dojo){
dojo.ready(function(){  
//Your code here
});
});
</script>

</body>
</html>
于 2013-08-14T19:12:10.043 回答
1

你确定你的dojo来源在“//ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js”,因为你的文件夹结构看起来像googleapis文件夹中的“ http:// ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js "

于 2013-01-30T07:31:42.807 回答