我正在使用由 adijit.form.FilteringSelect
支持的 adojox.data.QueryReadStore
以允许用户选择一个区域(想想“自动完成”机制)。在用户输入的每个字符上,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
仍然是选定的值。神秘的交换在那之后才发生……