我似乎无法将onchange事件正确附加到dijit.form.Select小部件。但是,我是网络开发的新手,所以我可能会做一些完全愚蠢的事情(虽然,我能说得最好(而且我已经读过我能找到的所有文档)我不是)。我确保body类匹配dojo主题,我为所有使用的小部件(和dojo.parser)dojo.require(),仍然是,nada。我正在使用的代码是:
dojo.addOnLoad(function () {
var _query = dojo.query('.toggle');
for (var i in _query) {
dojo.connect(_query[i], 'onchange', function (ev) {
console.log(ev + ' fired onchange');
});
}
});
任何帮助都将不胜感激。
另外:在深入了解dijit如何呈现小部件的内部之后,我发现当我将dojoType ='dijit.form.Select'属性值对添加到我的html元素(以声明方式执行此操作)时,dijit实际呈现一排两列表。表的第一个元素是一个span(带有类dijitSelectLabel),我假设它只显示所选(或默认)元素。它的第二个元素似乎是一个呈现为向下箭头的按钮,用于切换菜单主题的显示以响应某些DOM事件。另外(我认为这非常漂亮),dijit实际上并没有将选择选项放在DOM树中,直到触发其中一个事件。在一个新的页面加载(在我点击任何东西之前)之后我立即查看了firebug中的HTML,并且第二个选项无法找到。然后,一旦我点击箭头按钮,就会有一个dijit.Menu小部件,dijit会将dijit.Menu粘贴到body节点的末尾;单击其他位置后,“菜单”窗口小部件仍然是正文的lastChild,现在它只是隐藏而未附加到窗体。选择窗口小部件。
如果我想要做的就是在DOM树中放置一个不同的dijit.form小部件,具体取决于用户选择的项目,它真的会这么复杂吗?
结论:
事实证明这是一个资本化问题
dojo.connect(widget_obj, 'onChange', function_obj);
有效,而
dojo.connect(widget_obj, 'onchange', function_obj);
不点。
答案 0 :(得分:4)
对于通过网络搜索找到此页面的其他人,您可能犯了同样的错误。复制粘贴您的标记,使每个标记具有相同的“价值”。
e.g。
<select dojoType='dijit.form.Select' onChange="fn">
<option value='foo'>Foo 1</option>
<option value='foo'>Foo 2</option>
<option value='foo'>Foo 3</option>
</select>
永远不会调用fn(),因为更改处理程序代码会根据先前选择的值检查新值,并且除非更改,否则不会触发onChange。
答案 1 :(得分:2)
在执行dojo.connect时尝试以下操作:
var inputEvents = []; //Global var
inputEvents.push(dojo.connect(dijit.byId(inputFldStr), "onChange", eventFuncObj));
将连接存储在全局变种
中答案 2 :(得分:1)
在您的代码中,您将处理程序连接到dom节点的'onchange'事件,而不是dojo小部件。 dojo.query返回一个NodeList对象 - 与查询匹配的节点集合
在这种情况下,连接到小部件的'onChange'事件更加可靠,正如GoinOff所示。只是为了确保你做的正确而给他的答案增加了一点。
假设这是你的html(在更高版本的Dojo dijit.form.Select中已被dijit.form.FilteringSelect取代):
<input dojoType="dijit.form.FilteringSelect" id="stateInput" store="stateStore" searchAttr="name" name="state"/>
然后您将以这种方式连接到'onChange'(您也可以将连接存储在某个阵列中以便以后能够断开连接,如GoinOff建议的那样):
dojo.addOnLoad (function () {
dojo.connect(dijit.byId("stateInput"), "onChange", function(){});
}
但如果你不知道你的小部件的id并希望使用dojo.query连接到多个小部件,那么这是另一个故事。