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 任何解决方案或解决方法将不胜感激。
在此先感谢。
如果这是逐字从您的代码,它看起来像您的dojoType
声明附近缺少双引号。如果您的输入从未被声明为dijit小部件,它将永远无法通过dijit.byId()
进行检索。
如果你想要一个更一般的节点选择器,使用dojo.byId()
来代替,它会选择任何带有id的节点,而不仅仅是dijit小部件。
总是要记住在HTML属性周围放置双重排队。 – hugomg
@瑞恩我也试过用引号,它没有任何区别。 dojo.byId(),我相信,返回html元素。但我可以用它来调用dojo.connect()? – user469635
@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标记属性(位于左侧导航栏上)并运行它,则会得到您所描述的行为。
Duh!我怎么能忘记这一点?当然,你也必须告诉dojo解析你的扩展的HTML。 –
@BuffaloBuffalo感谢伟大的链接(jsfiddle) – user469635
我不相信Dojo的onLoad事件可以保证dijits已经被解析和实例化(因此可用于'dijit.byId')。你的dojoConfig中有'parseOnLoad:true'吗?如果你将'dojo.parser.parse();'添加到你的'regHandler'(在它的其他代码之前),会发生什么? – Frode