0

強調表示された選択を音声エンジン API に送信する Chrome 拡張機能を開発しています。コンテキストメニューとアイコンクリックの両方を実装したい。問題は次のとおりです。

これは完全に機能します:

chrome.contextMenus.create({
    "title" : "Speak Me",
    "contexts" : ["selection"],
    onclick: function (info, tab) {
        speakMe(info.selectionText);
    }
});

そのすぐ下に次のものがあります。

chrome.browserAction.onClicked.addListener(function() {
  speakMe(info.selectionText);
});

これは機能しません。

パラメータを空のままにすると、「未定義」という音声が返されます。つまり、音声エンジンがテキストがないと言っているのだと思います。私は何を間違っていますか?

これが問題の関数で、上に配置されています。

var speakMe = function (text) {
        var key, lang, url, audio;
        key = "key=12345678910";
        lang = "sv_se";
        url = "http://tts.engine.com/api/speak?" + key + "&lang=en_us&voice=male1&speed=100&audioformat=ogg&oggbitrate=100&text=" + text; 
        audio = new Audio(url);
        audio.play();
    };

選択テキストは、別の JS ファイルから取得されます。

function getSelectedText() {
  var text = "";
  if (typeof window.getSelection != "undefined") {
    text = window.getSelection().toString();
  } else if (typeof document.selection != "undefined" && document.selection.type == "Text") {
    text = document.selection.createRange().text;
  }
  return text;
}

しかし、コンテキストメニューは完璧に機能するので、問題はないと思います。適切に使用する方法がわからないのは browserAction だけです。

4

1 に答える 1

1

ブラウザー アクションの onClicked イベントには、選択されたテキストに関する情報がないためです。あなたはそれを自分で理解する必要があります。現在のページにコンテンツ スクリプトを挿入し、選択したテキストを で取得できますwindow.getSelection().toString()。次に、メッセージを内線番号に送り返し、テキストを読み上げます。

次に例を示します。

chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.executeScript(tab.id,
      {code: 'window.getSelection().toString()'}, function(results) {
    alert(results[0]);
  });
});

アラートを表示するだけですが、speakMe を呼び出すように変更するのは非常に簡単です。

于 2013-07-15T09:44:40.143 に答える