Javascript dijit.byId不工作(不是函数?)

Javascript dijit.byId不工作(不是函数?),javascript,ajax,dojo,Javascript,Ajax,Dojo,这是我的简单dojo示例: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.9.2/dijit/themes/dijit.css"> <link rel="st

这是我的简单dojo示例:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.9.2/dijit/themes/dijit.css">
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.9.2/dijit/themes/claro/claro.css">
<title>ShowMovies </title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript" data-dojo-config="isDebug: false, async: true, parseOnLoad: true" src="http://ajax.googleapis.com/ajax/libs/dojo/1.9.2/dojo.js"></script>
<script type="text/javascript">
    require(
    [ "dojo", "dojo/parser", "dijit/layout/BorderContainer",
            "dijit/layout/ContentPane", "dojox/grid/DataGrid",
            "dojo/data/ItemFileReadStore" ],
    function(dojo) {
        dojo.ready(function() {
            dojo.xhrGet( {
                url : "MovieList.json",
                handleAs : "json",
                load : function(response, ioArgs) {
                    var newData = {
                        identifier: "title",
                        items: response.result
                    };
                    var dataStore = new dojo.data.ItemFileReadStore({data: newData, id:"dataStoreId"});
                    var grid = dijit.byId("gridId");
                    grid.setStore(dataStore);
                },
                error : function(response, ioArgs) {
                    alert(response);
                }
            });
        });
    });
</script>
<link rel="stylesheet" type="text/css" title="Style" href="http://ajax.googleapis.com/ajax/libs/dojo/1.9.2/dojox/grid/resources/Grid.css">
<link rel="stylesheet" type="text/css" title="Style" href="http://ajax.googleapis.com/ajax/libs/dojo/1.9.2/dojox/grid/resources/claroGrid.css">
</head>
<body class="claro">
    <div id="BorderContainer" style="height: 100%; width: 100%"
        data-dojo-type="dijit.layout.BorderContainer"
        data-dojo-props="design:'headline'">
        <div data-dojo-type="dijit.layout.ContentPane"
            data-dojo-props="region:'top'" style="text-align: center">My Movie Web Application!</div>
        <div data-dojo-type="dijit.layout.ContentPane"
            data-dojo-props="region:'center'">
            <table id="gridId" autowidth="true"
                data-dojo-type="dojox.grid.DataGrid"
                data-dojo-props="rowSelector:'20px'">
                <thead>
                    <tr>
                        <th field="title">Title</th>
                        <th field="director">Director</th>
                        <th field="actor">Actor</th>
                        <th field="description">Description</th>
                    </tr>
                </thead>
            </table>
        </div>
        <div data-dojo-type="dijit.layout.ContentPane"
            data-dojo-props="region:'right'"></div>
    </div>
</body>
</html>

放映电影
要求(
[“dojo”、“dojo/parser”、“dijit/layout/BorderContainer”,
“dijit/layout/ContentPane”、“dojox/grid/DataGrid”,
“dojo/data/ItemFileReadStore”],
函数(dojo){
ready(function()){
dojo.xhrGet({
url:“MovieList.json”,
handleAs:“json”,
加载:函数(响应、ioArgs){
var newData={
标识符:“标题”,
项目:答复.结果
};
var dataStore=new dojo.data.ItemFileReadStore({data:newData,id:“dataStoreId”});
var grid=dijit.byId(“gridId”);
网格设置存储(数据存储);
},
错误:函数(响应,ioArgs){
警报(响应);
}
});
});
});
我的电影网络应用程序!
标题
经理
演员
描述
为什么我会收到xhrGet请求的错误?响应是:dijit.byid不是函数


Thx

快速的答案是:当Dojo配置中有
async:true
时,Javascript代码中可能不应该有任何以
Dojo.
dijit.
开头的内容

回到过去,在Dojo1.5和更早的版本中,Dojo及其模块的工作方式与今天略有不同

那时,您可以包括dojo.js,并立即提供一系列方便的功能,例如
dojo.create
dojo.connect
dojo.xhrGet
dijit.byId
等等。如果您想包含一些额外的模块或小部件,可以使用
dojo.require
,然后使用
dojo.some.thing
dijit.other.thing
引用该模块

在较新版本的Dojo中,当您在页面上包含Dojo.js时,实际上只会得到两个函数:
require
define
。您可以使用这些函数“导入”所需的所有内容。即使对于像
dojo.create
这样的小东西,您也必须导入一个模块

一开始,你可能会觉得这很不方便。如果您对Dojo为什么选择这个方向以及它的好处感兴趣,您可以看看这个

回到你的代码。您有
async:true
和许多
dojo.
dijit.
语句。以下是三种解决方法:

  • async:true
    更改为false。这使得Dojo以“旧”风格处理代码,即您的
    Dojo.
    dijit.
    应该仍然可以工作

  • 保持
    async:true
    ,但导入特殊的
    dijit/dijit
    模块,使旧的
    dijit.
    函数可用。所以你的第一行应该是这样的:

    require([“dojo”,“dijit/dijit”,..),function(dojo,dijit,…){


    (dojo模块也是一个允许“旧”样式的特殊模块。)

  • 将您的代码全部重写为新的AMD样式。这意味着对于每个
    dojo.
    dijit.
    ,您需要找出需要导入的模块。如果您已经有很多dojo代码,那么这将是一个小工作。您问题中的代码如下所示:


  • 你可能在想:为每件小事加载一个文件/模块一定很慢!你是对的。这个想法是,当你在本地开发时,它会足够快,当你部署你的web应用程序时,你将使用Dojo的构建工具在很少的文件中创建一个精益包。这是Dojo的绝对优势之一,你可以更多信息请点击此处:

    非常感谢您详细的回答!!您帮了我很多忙!