#javascript #jquery #html
#javascript #jquery — запрос #HTML #jquery
Вопрос:
Моя цель — создать ссылку с возможностью щелчка правой кнопкой мыши, которая показывает пользовательское контекстное меню. Я использую этот удобный плагин контекстного меню. Я могу заставить его работать со статическим HTML-контентом, но при создании html с использованием javascript щелчок правой кнопкой мыши не запускает мое пользовательское контекстное меню. Имеет ли это какое-то отношение к динамическому созданию HTML?
Мой код для создания HTML-кода таков
$('.cmenu1content a').contextmenu();
$('#add_stuff').click(function () {
var $html = '';
$html = '<div class="cmenu1content"><a data-context-menu=".cmenu1" href="#">But this doesnt</a><ul class="context-menu dropdown-menu cmenu1"><li><a href="#" id="cetstart">Set Start Time</a></li> <li><a href="#" id="cetend">Set End Time</a></li><li><a href="#" id="cet5">Center time (5 min)</a></li><li><a href="#" id="cet30">Center time (30 min)</a></li><li><a href="#" id="cet60">Center time (60 min)</a></li><li><a href="#" id="cet360">Center time (6 hour)</a></li></ul></div>'
$(".not_working_link").empty().html($html);
});
Вот JSFiddle моей ситуации. Плагин контекстного меню находится в строках 1-75, но мой код начинается со строки 77.
Комментарии:
1. Это потому, что элемент, который вы добавляете при нажатии, не имеет обработчика событий. Самый простой способ — добавить его, когда вы добавляете его в
click
обработчик путем вызова$('.not_working_link .cmenu1content a').contextmenu();
.2. Вот так: jsfiddle.net/a2WYS/6 Обратите внимание, что я изменил его на
$html = $($html);
и использовал$.append()
вместо$.html()
, чтобы я все еще мог ссылаться на него позже.
Ответ №1:
Если вы не можете использовать шаблон делегирования и работать из родительского элемента ( $.on()
метод со вторым селектором аргументов), вам следует добавить $.contextmenu()
вызов в click
обработчик; в противном случае обработчик событий не был установлен для нового элемента, только для тех, которые существовали при выполнении (предыдущего) вызова.
$('#add_stuff').click(function () {
// This will create a documentFragment that after appended, can
// still be worked on, as you see on the third line below.
var $html = $('<div class="cmenu1content"><a ... blah blah ... </div>');
// Note the use of `$.append()` instead of `$.html()`.
$(".not_working_link").empty().append($html);
$html.children('.cmenu1content a').contextmenu();
});
Комментарии:
1. Спасибо! Это в конечном итоге исправляет это!
Ответ №2:
Использовать на http://api.jquery.com/on / для того, чтобы оно работало с сгенерированными элементами или работало в более старом jquery http://api.jquery.com/live /
Комментарии:
1.
$.contextmenu()
Плагин на самом деле должен быть вызван, поэтому не уверен, что использование$.on()
является правильным подходом.