Javascript XUL菜单列表,以编程方式打开
我想在menulist XUL项中模拟自动完成的行为(原始的自动完成组件对于我的情况来说太不切实际了,所以实际上更容易使用它,然后创建一个完整的XPCOM组件) 但是,问题部分会导致它打开它的下拉部分,在下拉部分中以编程方式显示选项。也就是说,我不想按向下箭头按钮来打开它,我希望在我输入时打开它(或关闭,如果没有匹配选项)。既然我可以处理输入文本,我想在同一个处理程序中打开/关闭下拉部分,有没有办法 编辑 下面是我用于组件的XUL文件的简化示例:Javascript XUL菜单列表,以编程方式打开,javascript,xul,Javascript,Xul,我想在menulist XUL项中模拟自动完成的行为(原始的自动完成组件对于我的情况来说太不切实际了,所以实际上更容易使用它,然后创建一个完整的XPCOM组件) 但是,问题部分会导致它打开它的下拉部分,在下拉部分中以编程方式显示选项。也就是说,我不想按向下箭头按钮来打开它,我希望在我输入时打开它(或关闭,如果没有匹配选项)。既然我可以处理输入文本,我想在同一个处理程序中打开/关闭下拉部分,有没有办法 编辑 下面是我用于组件的XUL文件的简化示例: <?xml version="1.0"?&
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>
<dialog id="whatever" title="Select a tab to open"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
buttons="accept,cancel"
buttonlabelcancel="Cancel"
buttonlabelaccept="Save"
ondialogaccept="return doOK();"
ondialogcancel="return doCancel();">
<dialogheader title="Select tab"/>
<menulist id="search-box" editable="true"
oncommand="commandHandler(event)"
onkeyup="keyUpHandler(event)"/>
<script>
var a = window.arguments[0];
var opener = window.arguments[1];
var menu = document.getElementById('search-box');
function doOK()
{
opener.selectTabAtIndex(a.indexOf(menu.value));
return true;
}
function doCancel(){ return true; }
function commandHandler(event)
{
doOK();
window.close();
}
function keyUpHandler(event)
{
var v = menu.value;
menu.removeAllItems();
populate(a.filter(function (x, i)
{
if (x == v) opener.selectTabAtIndex(i);
return x.indexOf(v) > -1;
}));
}
function populate(choices)
{
for (var i = choices.length - 1, s; i >= 0; i--)
{
s = choices[i];
menu.appendItem(s, s);
}
}
menu.focus();
menu.select();
populate(a);
menu.open = true;
</script>
</dialog>
以及按键向下/按键向上/按键和切换按键代码、charcode和yada-yada的变化,所有这些都无效
顺便说一句,我喜欢API,这让我想起了旧的好WinAPI,但还没有足够的无用参数它实际上非常简单,您可以使用:
menulist.open=true;
您的问题可能是人们不希望该属性是读/写的,而是寻找一个方法,但更改该属性确实是打开下拉列表的正确方式。实际上很简单,您可以使用:
menulist.open=true;
你的问题可能是人们不希望这个属性是读/写的,而是寻找一个方法——但更改属性确实是打开下拉列表的正确方式。@wvxvw:请随意从一开始就选择有意义的标记(我已经使用伪标记重新标记了所有问题)。从技术上讲,Firefox加载项和XULRunner应用程序之间没有区别,但是有更多的人在观看这个标签——但正如你所希望的那样。顺便说一句,我试过了,并且
menulist.open
确实有效。因此,问题可能出在您的populate()
函数中。@wvxvw:请随意从一开始就选择有意义的标记(我已使用伪标记重新标记了所有问题)。从技术上讲,Firefox加载项和XULRunner应用程序之间没有区别,但是有更多的人在观看这个标签——但正如你所希望的那样。顺便说一句,我试过了,并且menulist.open
确实有效。因此,问题可能出在您的populate()
函数中。旁注:不要使用keyup
事件,请使用input
事件。例如,如果用户将文本拖到文本字段中,代码将失败。旁注:不要使用keyup
事件,请使用input
事件。例如,如果用户将文本拖到文本字段中,代码将失败。
var e = document.createEvent("KeyboardEvent");
e.initEvent("keydown", true, false, menu, false, false, false, false, 0, 40);
menu.dispatchEvent(e);