dijit.byId()即使在dojo.addOnLoad()中也会返回undefined

问题描述:

我最近开始在dojo中工作。 即使我把这个调用放在dojo.onLoad()中,dijit.byId()也会返回undefined。dijit.byId()即使在dojo.addOnLoad()中也会返回undefined

<script type="text/javascript"> 
dojo.require("dijit.form.Select"); 
function myhandler(ev) 
{ 
    var mydiv = dojo.byId('mydivid'); 
    if (ev == 'Disable') { 
     mydiv.style.display = 'none'; 
    } else { 
     mydiv.style.display = 'block'; 
    } 
} 
function regHandler() 
{ 
    var item = dijit.byId("myState"); 
    alert(item);//shows undefined 
    dojo.connect(dijit.byId("myState"), 'onChange', myhandler); 
} 
dojo.addOnLoad(regHandler); 
</script> 

<select input class="dialogInputElement" dojoAttachPoint="myState" dojoType=dijit.form.Select name="myState" id="myState" value='Enable' style="margin-bottom:5px"> 
<option value="Enable">Enable</option> 
<option value="Disable">Disable</option> 
</select> 

它工作正常,如果我延迟dijit.byId()与setTimeout()调用。 dojo版本是1.4.2 任何解决方案或解决方法将不胜感激。

在此先感谢。

+0

我不相信Dojo的onLoad事件可以保证dijits已经被解析和实例化(因此可用于'dijit.byId')。你的dojoConfig中有'parseOnLoad:true'吗?如果你将'dojo.parser.parse();'添加到你的'regHandler'(在它的其他代码之前),会发生什么? – Frode

如果这是逐字从您的代码,它看起来像您的dojoType声明附近缺少双引号。如果您的输入从未被声明为dijit小部件,它将永远无法通过dijit.byId()进行检索。

如果你想要一个更一般的节点选择器,使用dojo.byId()来代替,它会选择任何带有id的节点,而不仅仅是dijit小部件。

+0

总是要记住在HTML属性周围放置双重排队。 – hugomg

+0

@瑞恩我也试过用引号,它没有任何区别。 dojo.byId(),我相信,返回html元素。但我可以用它来调用dojo.connect()? – user469635

+0

@missingno有或没有引号,它工作,如果我添加一个延迟,如下所示:'function regHandler() { var item = dijit.byId(“myState”); alert(item); //显示undefined dojo.connect(dijit.byId(“myState”),'onChange',myhandler); } function myshim() setTimeout(“regHandler()”,1000); } dojo.addOnLoad(myshim);'但我希望它毫不拖延地工作。 – user469635

您是否尝试将属性djConfig =“parseOnLoad:true”添加到dojo配置中?

当包括的dojo.js库文件,您可以设置该属性是这样的:

<script type="text/javascript" src="dojo/dojo.js" 
     djConfig="parseOnLoad: true"> 
</script> 

在我的测试中,这似乎是解决这个问题。在此jsfiddle请注意,如果您删除djconfig标记属性(位于左侧导航栏上)并运行它,则会得到您所描述的行为。

+0

Duh!我怎么能忘记这一点?当然,你也必须告诉dojo解析你的扩展的HTML。 –

+0

@BuffaloBuffalo感谢伟大的链接(jsfiddle) – user469635