2011-01-19 3 views
5

私はDOI番号を強調表示し、右クリックして "DOIの解決"を選択し、それを関連付けられたWebページに送信することができる非常に簡単なchrome extensionを作成しました。Chrome拡張機能で選択した特定のテキストにのみコンテキストメニューが表示されるように制限するにはどうすればよいですか。

chrome.contextMenus.create({ 
"title" : "Resolve DOI", 
"type" : "normal", 
"contexts" : ["selection"], 
"onclick" : getClickHandler() 
}); 

は、私は、彼らが強調表示テキストが「10」で始まる場合にのみ表示されるコンテキストメニューのオプションを制限したいと思います。今のところ、これはとbackground.htmlで行われますこれを行う方法に関する提案はありますか?コンテキストメニューモジュールがより高度になるのを待つ必要がありますか?

答えて

9

コンテンツスクリプトからコンテンツメニューの作成を制御する必要があります。動的なメニューの作成/削除はかなり速く実行されるはずであり、遅延はユーザにとって目立たない。

  • コンテンツスクリプトにmousedownイベントリスナーを追加し、選択があなたのパターンを満たしているかどうかをチェックします。
  • 選択がパターンと一致するかどうかに基づいて、背景ページにメニューの作成または削除を求める要求を送信します。

これらの線に沿って何か(試験せず):

content_script.js:

document.addEventListener("mousedown", function(event){ 
    var selection = window.getSelection().toString(); 
    if(selection.match(/^10\./)) { 
     chrome.extension.sendRequest({cmd: "create_menu"}); 
    } else { 
     chrome.extension.sendRequest({cmd: "delete_menu"}); 
    } 
}, true); 

background.html:

chrome.extension.onRequest.addListener(function(request) { 
    if(request.cmd == "create_menu") { 
     chrome.contextMenus.removeAll(function() { 
      chrome.contextMenus.create({ 
       "title" : "Resolve DOI", 
       "type" : "normal", 
       "contexts" : ["selection"], 
       "onclick" : getClickHandler() 
      }); 
     }); 
    } else if(request.cmd == "delete_menu") { 
     chrome.contextMenus.removeAll(); 
    } 
}); 
+0

素晴らしいです。テストし、修正する必要はありません。どうもありがとうございます。これにより、リスナーに紹介されるので、オプションページで変更をすぐに適用できるようになります。 – MDMower

+0

httpsページに問題があるようです。 content_script.jsが正しくフィルタリングされていません。例: このページと拡張機能のページ(https://chrome.google.com/webstore/detail/goanbaknlbojfglcepjnankoobfakbpg)はどちらも公開されています。私は "10"を含むテキストを選択します。このページでメニューが作成されます。私は他のタブに移動し、任意のテキストを選択し、メニューはまだ存在します。私はこのページに戻って、非「10」を選択します。テキストが表示され、メニューが消えます。有効な選択をするかどうかに関わらず、httpsタブに戻るとメニューは表示されません。 – MDMower

+0

@mdmowerセキュリティ上の理由から、Webstoreのページでコンテンツスクリプトが無効になっています(古い拡張ギャラリーサイトでも同じです) – serg

関連する問題