使用Dojo进行编码,收到错误'dijit.byId(...)'为null或不是对象

时间:2011-06-09 20:57:47

标签: dojo

我在网上看到很多对此错误的引用,但它们并没有帮助我。我想我已经足够新了,我需要一个特定的答案来解决我的问题      我在我正在运行的页面上附加了第一部分代码。我显示的最后一行是在标题中创建错误的行。如果您有任何建议,请告诉我。 谢谢!

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
  <title>CDI Web Portal</title>
  <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
   <script src="js\dojo\dojo.js" type="text/javascript"></script>
  <script type="text/javascript" src="http://www.google.com/jsapi?key=ABQIAAAA5a4NhilcmrdMQ5e3o22QWRQWrGbhbxAguaJ-a4SLWYiya7Z2NRTDfQBdxmHdf5ydkZYLZTiz1tDXfg"></script>
  <script type="text/javascript" src="ge-poly-fit-hack.js"></script>
  <script type="text/javascript" src="kmldomwalk.js"></script>
  <style type="text/css">
    @import "js/dijit/themes/tundra/tundra.css";
    @import "js/dojo/resources/dojo.css";
  </style>
  <style type="text/css">@import "index.css";</style>

    <script type="text/javascript"> dojo.ready(function() { dojo.byId("greeting").innerHTML += ", from " + dojo.version; });     </script>

<script type="text/javascript">
    // <![CDATA[

    djConfig = { parseOnLoad: true };
   // google.load("dojo", "1.6.1");
    google.load("maps", "2");
    google.load("earth", "1");

    var g_ge;
    var g_earthDisabled = false;
    var g_kmlObject;

    google.setOnLoadCallback(function() {
        dojo.require('dijit.layout.BorderContainer');
        dojo.require('dijit.layout.SplitContainer');
        dojo.require('dijit.layout.ContentPane');
        dojo.require('dijit.Tree');
        //dojo.require('CheckboxTree');
        dojo.require('dijit.form.CheckBox');
        dojo.require('dijit.form.Button');
        dojo.require('dijit.form.TextBox');
        dojo.require('dojo.data.ItemFileWriteStore');
        dojo.require('dojo.parser');
        dojo.require('dojo.cookie');
        dojo.require('dojo.fx');
        dojo.addOnLoad(function() {
            // load checkboxtree
            var scpt = document.createElement('script');
            scpt.src = "dijit.CheckboxTree.js";
            document.body.appendChild(scpt);

            { dijit.byId('load-button').setDisabled(true) };
            // build earth
            google.earth.createInstance(
      'map3d',
      function(ge) {
          g_ge = ge;
          g_ge.getWindow().setVisibility(true);
          g_ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);
          g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_BORDERS, true);
          g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_BUILDINGS, true);

          dijit.byId('load-button').setDisabled(false);
          checkAutoload();
      },
      function() {
          g_earthDisabled = true;
          dijit.byId('load-button').setDisabled(true);

2 个答案:

答案 0 :(得分:3)

根据您的评论,您使用声明性语法来创建dijit,即<button id="load-button" dojoType="dijit.form.Button" onclick="loadKml();">。如果使用声明性语法,则实际在加载页面后创建dijit。所以你应该把代码放在Dojo的加载回调中使用dijit,即在dojo.addOnLoad回调内部。

但是您的代码格式错误并且与Google Maps加载回调混合在一起,检查代码并不容易。我的建议是将dijit.byId('load-button').setDisabled(true);dojo.addOnLoad一起打包,如下所示:

dojo.addOnLoad(function() {
    dijit.byId('load-button').setDisabled(true);
});

答案 1 :(得分:0)

这意味着你有一个dojo对象而不是一个dijit对象 - 或者根本没有一个名为load-button的对象,因为从这里创建load-button并不清楚。确保使用dijit创建了id="load-button"的对象。