Помощь расширения Safari! Отображение пункта контекстного меню только тогда, когда пользователь щелкает правой кнопкой мыши класс

У меня простой вопрос относительно пункта контекстного меню для расширений Safari. Я хочу, чтобы пункт контекстного меню «Метка элемента меню A» появлялся, когда пользователь щелкает правой кнопкой мыши по определенному классу на HTML-странице. Любые идеи, какие типы событий я должен слушать или как мне это сделать? Спасибо.


person blee908    schedule 26.02.2014    source источник
comment
Это должно заставить вас двигаться в правильном направлении. Я уверен, что это так же просто, как проверить класс выбранного элемента в обратном вызове. developer.apple.com/library/safari/ документация/Инструменты/   -  person Luke Sapan    schedule 27.02.2014
comment
Спасибо. Я попытался прослушать событие contextmenu, но, похоже, оно не дает мне элемент HTML, на котором пользователь щелкает правой кнопкой мыши, а вместо этого какой-то объект SafariBrowserTab. И даже если бы я его получил, я не уверен, как предотвратить появление пункта контекстного меню.   -  person blee908    schedule 27.02.2014
comment
Хм, оставить это Сафари, а? :P Пробовали ли вы проверять объект SafariTab? Проверьте его дочерние элементы и даже его дочерние дочерние элементы. Вы можете найти объект, по которому щелкнули, там. Кроме того, это полное предположение, но, возможно, возврат false в обратном вызове предотвратит отображение контекстного меню?   -  person Luke Sapan    schedule 27.02.2014
comment
Я только что дважды проверил документы, и действительно похоже, что event.target возвращает объект, по которому щелкнули.   -  person Luke Sapan    schedule 27.02.2014
comment
Я новичок в расширении Safari, и я даже не уверен, как лучше всего его отлаживать, кроме как вызывать предупреждения. console.log не работает. Я посмотрю на SafariBrowserTab, но я не думаю, что он даст мне элемент HTML, на котором пользователь щелкнул правой кнопкой мыши. Я хочу предотвратить отображение пункта меню, а не всего контекстного меню. Спасибо за помощь!   -  person blee908    schedule 27.02.2014
comment
@LukeSapan event.target для команды события дал мне объект SafarContextMenuItem. event.target для контекстного меню события дал мне объект SafariBrowserTab. Когда я вызвал alert(event.target)   -  person blee908    schedule 27.02.2014


Ответы (1)


Что вам нужно, так это внедренный скрипт. См. страницу документации, на которую ссылался Люк, под заголовком «Добавление контекстной информации». Ваш внедренный скрипт должен иметь обработчик события «contextmenu», подобный этому:

document.addEventListener("contextmenu", function (evt) {
    safari.self.tab.setContextMenuEventUserInfo(evt, evt.target.className);
}, false);

В скрипте вашей глобальной страницы у вас должно быть что-то вроде этого:

safari.application.addEventListener("contextmenu", function (evt) {
    // evt.userInfo will have the classname of the right-clicked element
    if (evt.userInfo == 'my_special_className') {
        evt.contextMenu.appendContextMenuItem('myCommandName', 'My Context Menu Item');
    } else {
        // don't insert the context menu item
    }
}, false);

Подробнее об внедренных скриптах: https://developer.apple.com/library/archive/documentation/Tools/Conceptual/SafariExtensionGuide/InjectingScripts/InjectingScripts.html

Подробнее о setContextMenuEventUserInfo: https://developer.apple.com/documentation/safariextensions/safaricontentbrowsertabproxy

person chulster    schedule 27.02.2014
comment
Помните, что target события contextmenu может не иметь имя класса, которое вы ищете, но может быть у одного из его предков. Если это имеет значение, вам придется проверить имена классов всех предков цели события. - person chulster; 27.02.2014