jQuery上下文菜单 - 查找触发它的元素

时间:2010-12-13 14:51:30

标签: jquery html css contextmenu

我正在尝试为我的页面编写上下文菜单选项。 基本上右键单击了一个div,弹出一个选项菜单,可用于执行任务。

我的问题是试图找到触发所有内容的原始元素(即右键单击的div)。

我的jQuery代码更多或更少:

//this is what displays the context menu
$('.outfeedPosition').bind("contextmenu", function (e) {
    $('#contextMenu').css({
        top: e.pageY + 'px',
        left: e.pageX + 'px'
    }).show();

    //'this' is the element which was clicked by the user.
    alert($(this).attr('id'));

    return false;
});



//this is the contextMenu's button handler.
$('#ctxDelete').click(function () {
    alert('delete was clicked, but i dont know by which element - so I dont know which one to delete');
});


<div id="contextMenu">
    <ul>
        <li><a id="ctxInsert" href="#">Insert</a></li>
        <li><a id="ctxEdit" href="#">Edit</a></li>
        <li><a id="ctxDelete" href="#">Delete</a></li>
    </ul>
</div>

- 所以 - 当初始右键单击发生时,我可以看到创建事件的元素。 但不是在点击菜单项时。

我正在努力通过在右键单击时将元素写入隐藏的文本框,然后在单击其中一个选项时读取它,然后在菜单关闭时将其删除,从而解决这些问题。 虽然看起来不是理想的方法 - 而且我觉得我缺少一些基本的东西。

希望你能看到我想要做的事情。 我可以根据要求发布更完整的示例。

3 个答案:

答案 0 :(得分:6)

您可以考虑使用jQuery data storage方法。

在上下文菜单代码中,您可以输入:

$('.outfeedPosition').bind("contextmenu", function (e) {
    $('#contextMenu').css({
        top: e.pageY + 'px',
        left: e.pageX + 'px'
    }).show();

    //Store the item that was clicked 
    $("#contextMenu").data('originalElement', this);

    return false;
});

然后,当您想引用启动了点击的元素时,您可以这样做:

$('#ctxDelete').click(function () {
    var originalElement = $("#contextMenu").data('originalElement');
    alert('delete was clicked by ' + originalElement.id );
});

originalElement放在jQuery函数$()中以访问jQuery的优点。放置数据的位置无关紧要,因为任何DOM元素都可以包含与之关联的数据。你可以存储任何东西 - 在上面的示例代码中,我存储了HTMLElement raw(不是jQueryified),但是你也可以存储它。

请参阅此处获取一个小例子:http://www.jsfiddle.net/jonathon/sTJ6M/

答案 1 :(得分:2)

我添加了一个隐藏字段,然后根据点击找到它,如下所示:

<div class="myItem">
    <div id="contextMenu">
        <ul>
            <li><a id="ctxInsert" href="#">Insert</a></li>
            <li><a id="ctxEdit" href="#">Edit</a></li>
            <li><a id="ctxDelete" href="#">Delete</a></li>
        </ul>
    </div>
    <input type="hidden" class="myID" value="1">
</div>

然后使用JQuery

$('#ctxDelete').click(function () {
    var id = $(this).closest('.myItem').find('.myID').val();   
    alert('delete was clicked, by element with ID = ' + id);
});

答案 2 :(得分:2)

我在这里参加派对有点晚了,但我发现当生成上下文菜单时,活动项会获得“上下文 - 菜单 - 活动”状态。类添加到它。这可能只是在更新的版本中。我使用上下文菜单1.6.6。

只需添加:

var originalElement = $('.context-menu-active');

到上下文菜单处理程序。这里结合了示例代码。

$(function(e){
    $.contextMenu({
        selector: '.context-menu-one',
        callback: function(key, options) {
            var originalElement = $('.context-menu-active');
            var m = "clicked: " + originalElement[0].innerHTML;
            window.console && console.log(m);
        },
        items: {
            "edit": {name: "Edit"},
            "cut": {name: "Cut"},
            "copy": {name: "Copy"},
            "paste": {name: "Paste"},
            "delete": {name: "Delete"},
            "sep1": "---------",
            "quit": {name: "Quit"}
        }
    });

    $('.context-menu-one').on('click', function(e){
       console.log('clicked', this);
    })
});