【发布时间】:2010-10-03 02:11:49
【问题描述】:
我使用由dojox.data.QueryReadStore 支持的dijit.form.FilteringSelect 以允许用户选择一个区域(想想“自动完成”机制)。在用户输入的每个字符上,QueryReadStore 向服务器发送一个请求,等待匹配区域的 json 列表(带有关联的 ID)。当显示足够短的列表时,用户选择了所需的项目。 [诚然,每次击键都进行查询并不是最有效的模式,但现在已经足够了。]
意外行为:在一些罕见但特定的情况下,用户做出的选择“不会坚持”。例如,如果用户键入“can”,则会按顺序显示以下选项:
Atlantic Canada
Canada
English Canada
Lower Canada
Upper Canada
Western Canada
如果她在其中选择“Canada”,dijit 将关闭下拉选择,并正确选择了她的选择。但是当用户离开该字段时,选择会切换到“Atlantic Canada”!
这种奇怪现象系统地发生在少数特定地区。 (起初,我认为这些行为不端的地区之间的共同因素是它们的名称包含重音字符或连字符,但加拿大的例子显然不是这样。到目前为止,我没有发现一个规律的模式。)
我在任何地方都没有发现任何类似问题的提及。我非常愿意进行调查,但是,由于我是 dojo 的新手,在我求助于深入研究 dojo 的代码之前,我真的很感激指点:我应该首先看哪里?有哪些可能导致这种行为的问题?我可以排除某些假设吗?我应该如何最好地使用控制台(或 Firebug)来深入了解这一点?等等
dojo 1.1.1 和 dojo 1.2.3 都会出现问题。
这是FilteringSelect 的(程序化)生成:
new dijit.form.FilteringSelect({
name = "region";
autoComplete = false;
hasDownArrow = false;
labelAttr = "name";
queryExpr = "${0}";
store = new dojox.data.QueryReadStore({url:'/query/regions'});
}, myNode);
编辑 (2009/02/18):更多详情
根据 damelin 的回答,我想了解 FilteringSelect 看到这种情况的原因。假设我将日志记录功能连接到FilteringSelect 的事件onChange 和onBlur,我得到以下逐个播放序列:
- 我单击该字段并输入:
can - 出现 6 个区域(如上所列)的下拉列表
- 使用键盘光标,我将列表向下移动到“
Canada”(这是 id 为 1 的区域) -
我按
Enter(因此选择商店的一个项目)。下拉列表现已消失,文本“Canada”出现在字段中。此时,第一个事件被触发,记录如下:onChange event: region 1 -
我按
tab离开现场。这里,两个事件一个接一个地被触发,顺序如下:onBlur event: region 1 onChange event: region 246
(区域 246 是 Atlantic Canada。)现在这很有趣......当我离开该字段时(onBlur),Canada 仍然是选定的值。神秘的交换只是在那之后发生......
【问题讨论】:
标签: json dojo autocomplete