контекстное меню jQuery-поиск того, какой элемент вызвал его

Я пытаюсь написать опцию контекстного меню для моей страницы. В основном 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 ответов


вы можете рассмотреть возможность использования jQuery хранилище данных методы.

в вашем коде контекстного меню вы можете поставить:

$('.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/


Я добавляю скрытое поле, а затем нахожу его на основе щелчка, например:

<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);
});

Я немного опаздываю на вечеринку здесь, но я обнаружил, что при создании контекстного меню активный элемент получает класс "контекстное меню-active", добавленный к нему. Это может быть только в более поздних версиях. Я использую контекстное меню 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);
    })
});