2013-03-09 5 views
2

Я создал контекстное меню в моем расширении chome как флажок, мне удастся создать меню, которое будет видно только для редактируемого поля.Контекстное меню расширения Chrome с настраиваемым контекстом

Проблема в том, что мне нужно отобразить меню, как отмечено, в соответствии с атрибутом данных в текстовом поле (сфокусированный элемент). С помощью следующего кода он отображается на глобальном уровне (это означает, что если я проверил меню на одной странице/elemebt, он будет проверен и на других страницах/элементах.)

Как я могу сделать его проверенным/непроверенным в соответствии с атрибутом данных элемента?

var addinMenu = chrome.contextMenus.create({ 
    "title": "My Addin Menu", 
    "contexts": ["editable"] 
}); 
var disableOrEnable = chrome.contextMenus.create({ 
    "type": "checkbox", 
    "title": "Disable", 
    "parentId": addinMenu, 
    "id": "myaddin_disable", 
    "checked": true, 
    "contexts": ["editable"], 
    "onclick": disableOrEnableMyAddin 
}); 
+1

Связанные: [Отображение кнопок контекстного меню только при нажатии правой кнопкой мыши на классы, начинающиеся с «Story»] (http://stackoverflow.com/questions/14829677/showing-context-menu-buttons-only-when-right -clicked-on-classes-that-start-with) (пример работает с именем класса, но настройка кода для использования атрибута данных не должна быть слишком сложной) –

+0

Спасибо, я попытаюсь настроить этот и пусть вы знаете. – jijesh

ответ

1

Вызов chrome.contextMenus.update() когда свойства меню следует изменить, например:

chrome.contextMenus.update(
    disableOrEnable, 
    { type: 'checkbox', checked: false }); 

Похоже, что вы можете поймать oncontextmenu события и внести изменения, которые немедленно отражается в публикуемом меню (но я вижу из Комментарий Роба может быть race condition с этим). Это работает для меня:

var contextMenu = chrome.contextMenus.create(
    { 
    type: 'checkbox', 
    title: 'how now brown cow', 
    checked: false, 
    contexts: ['all'] 
    }); 

var element = document.getElementById('hello'); 
element.addEventListener(
    'mouseover', 
    function(e) { 
    element.setAttribute('underMouse', 'true'); 
    }); 
element.addEventListener(
    'mouseout', 
    function(e) { 
    element.setAttribute('underMouse', ''); 
    }); 

window.oncontextmenu = function(e) { 
    chrome.contextMenus.update(
    contextMenu, 
    { 
     type: 'checkbox', 
     checked: element.getAttribute('underMouse') == 'true' 
    }); 
} 

Если вы просто заинтересованы в настоящее время сосредоточены TextField вы также можете просто изменить свое меню в focus и blur событий. Вы также можете проверить опцию 'editable' на свойство меню contexts (не знаете, что это значит, но похоже, что это может ограничить меню текстовыми элементами ввода).

+0

Это обновит статус повсюду, а не по отношению к одному элементу управления, мне нужно отобразить включение/выключение в другом элементе. Допустим, у меня есть два текстовых поля на одной странице. Если вы проверяете меню в одном из них, он не должен отображать флажок для другого при открытии контекстного меню. – jijesh

+0

Я вижу. Не можете ли вы поймать [правую кнопку мыши] (http://stackoverflow.com/questions/9500743/js-detect-right-click-without-jquery-inline) (или другое событие контекстного меню) и изменить его? Я не уверен, что он будет обновляться, пока меню уже отображается. – rhashimoto

+0

Вы также можете использовать события ввода/выхода для обновления меню. – rhashimoto

Смежные вопросы