我正在使用jquery-ui-contextmenu jquery插件。我有几个动态生成的div,每个div都有一个pre标签。我想要的是初始化插件一次,当用户突出显示文本并释放鼠标左键以触发位于鼠标位置的上下文菜单时。
到目前为止,我已经能够触发菜单,但是一旦释放按钮,我似乎无法将菜单的位置粘在鼠标上,如果用户右键单击它们就会得到2个上下文菜单。
这是我的fiddle作为示例
$("div.editor").contextmenu({
delegate: "pre",
menu: [
{title: "Copy", cmd: "copy", uiIcon: "ui-icon-copy"},
{title: "----"},
{title: "More", children: [
{title: "Sub 1", cmd: "sub1"},
{title: "Sub 2", cmd: "sub1"}
]}
],
select: function(event, ui) {
alert("select " + ui.cmd + " on " + ui.target.text());
}
});
$("pre").bind("mouseup",function(e){
$("div.editor").contextmenu('open',$("pre"));
});
<div class="editor"><pre></pre></div>
这只是一些示例代码,但它与我正在使用的代码非常相似。我们在每个div下面都有一个表单,它有几个字段,我们想要用pre标签中包含的大文本填充。并且可能有多达20个div.editor标签,每个标签都有自己的形式。
关键在于用户可以突出显示特定的单词或短语,并轻松将其插入相应的表单字段中。我可以使用突出显示然后右键单击方法,但对于有数百个这样做的用户来说,这需要额外的时间。
非常感谢任何帮助。
再次感谢
答案 0 :(得分:2)
我找到了一个解决方案,希望这可以帮助那些可能想和我一样做的人。
因此,您必须在定义上下文菜单时添加位置。然后在mouseup上执行绑定以触发open方法。我使用extraData功能传递原始鼠标事件。这就是它在鼠标上的位置,而不是屏幕的左上角。
$("div.editor").contextmenu({
delegate: "pre",
position: function(event, ui){
return {my: "left top", at: "left bottom", of: ui.extraData, collision: "fit"};
},
...});
然后在定义上下文菜单后绑定到mouseup事件以获取所选文本。 我使用一些函数来获取所选文本并取消选择文本(IE bug)
$("pre").bind("mouseup",function(e){
mytext = getSelectionHtml(), t = $(e.target), p = $('#' + t.prop('id'));
if(mytext.length > 0){
deselHTML();
console.log(mytext + ' selected, calling open on the context menu. ' + $(p).prop('class'));
$("div.editor").contextmenu('open',$(t),e);
}
});