在选择一次之后,我无法通过鼠标单击为 jQuery UI 1.9 menu() 生成焦点事件。当我第一次单击菜单中的任何元素时,它会调用这个选择处理程序:
function selcatfunc(event,ui) {
var td = event.currentTarget;
var cid = $(td).attr('data-cid');
var nam = $(td).find("a").text();
if (cid) {
$("#cat-target").text(nam).attr('data-cid', cid);
$( "#CatMenu" ).hide(); $( "#CatListOverlay" ).hide();
} else {
$( "#CatMenuList" ).focus(event, ui);
}
};
$(function() {
$( "#CatMenuList" ).menu({ select: selcatfunc });
});
菜单中的每个<li
> 都定义了一个 data-cid,以便我知道所选元素的内部代码。人类可读的文本位于:
<div id="CatMenu" class="CatList">
<ul id="CatMenuList">
<li data-cid="30.0"><a href="javascript:void(0);">Bars, Nightclubs, Sports Bars</a></li>
<li data-cid="200.14"><a href="javascript:void(0);">Used Car</a></li>
...
</ul>
</div>
没有 data-cid的<li
> 是一个扩展为子菜单的类别标题。
<li><a href="javascript:void(0);">Accessories</b></a>
<ul>
<li data-cid="10.02"><a href="javascript:void(0);">Men's Accessories</a></li>
<li data-cid="10.04"><a href="javascript:void(0);">Teen Accessories</a></li>
<li data-cid="10.06"><a href="javascript:void(0);">Women's Accessories</a></li>
</ul></li>
不应该选择诸如附件之类的类别标题,这就是在选择处理程序中调用 .focus() 的原因。cat_target 是一个向用户显示选择的内容。
菜单在我第一次使用时运行良好。但是,如果我在子菜单上隐藏()它或聚焦(),我无法在不重新加载对话框的情况下再次选择其中的任何内容。
我通过http://jsbeautifier.org/上的漂亮打印机运行 //ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js 。我了解到所有 jQuery 鼠标事件都在第 1277 行传递给处理程序,并在那里添加了一条 Firebug 日志记录语句:
d.handler && (o = d, d = o.handler, f = o.selector), d.guid || (d.guid = p.guid++), i = g.events, i || (g.events = i = {}), h = g.handle, h || (g.handle = h = function (a) {
console.log("a ", a, " at ", a.type, " h ", h.elem, " args ", arguments);
return typeof p != "undefined" && (!a || p.event.triggered !== a.type) ? p.event.dispatch.apply(h.elem, arguments)
当菜单选择成功时,console.log 语句记录鼠标按下、点击、鼠标离开,最后将对象 a 打印为 Object { type= "focus", timeStamp=1351561057050, jQuery182035863344054812873=true, more...}
我的 select 函数被调用,并且 text 和 data-cid 按预期写入。选择函数在包含菜单的分区上调用 hide()。
当我使用 show() 重新出现菜单分区并尝试选择其他内容时,会发生所有鼠标事件,包括 click 和 mouseout,但没有打印 a 作为“focus”类型的对象。似乎隐藏菜单破坏了鼠标单击处理程序,使其不再生成焦点事件?
这些焦点事件是 jQuery 调用 jQuery UI 系统的方式;没有它们,就无法返回 UI。
谁能建议一种修复鼠标处理程序的方法?或者告诉我我是如何破坏焦点机制的?或者当我显示()菜单时如何把它放回去?