web-dev-qa-db-ja.com

コンテキストメニューが実行された要素を取得する方法

コンテキストメニューを使用するグーグルchrome拡張機能を書き込もうとしています。このコンテキストメニューは編集可能な要素(入力テキストなど)でのみ使用できます。コンテキストメニューをクリックして実行すると、次のようになります。この入力テキストに関連付けられた値を更新するために、コンテキストメニューが実行された要素(入力テキスト)をコールバック関数で取得します。

これが私の拡張機能のスケルトンです:

function mycallback(info, tab) {
  // missing part that refers to the question:
  // how to retrieve elt which is assumed to be 
  // the element on which the contextMenu has been executed ?
  elt.value = "my new value"
}

var id = chrome.contextMenus.create({
        "title": "Click me",
        "contexts": ["editable"],
        "onclick": mycallback
    });

Mycallback関数に関連付けられたパラメーターには、右クリックされた要素を取得するための有用な情報が含まれていません。これは既知の問題のようです( http://code.google.com/p/chromium/issues/detail?id=39507 )が、数か月経っても進展はありません。誰かが回避策を知っていますか:jqueryなしおよび/またはjqueryあり?

37
Laurent

mousedownイベントリスナーを使用してコンテンツスクリプトを挿入し、クリックされた要素を保存できます。

content script.js

//content script
var clickedEl = null;

document.addEventListener("mousedown", function(event){
    //right click
    if(event.button == 2) { 
        clickedEl = event.target;
    }
}, true);

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if(request == "getClickedEl") {
        sendResponse({value: clickedEl.value});
    }
});

background.js

//background
function mycallback(info, tab) {
    chrome.tabs.sendMessage(tab.id, "getClickedEl", function(clickedEl) {
        elt.value = clickedEl.value;
    });
}
58
serg