0

WebExtensions を使用して Firefox アドオンを開発しようとしています。私がやろうとしているのは、ユーザーが通知をクリックしたときに新しい Firefox タブまたはウィンドウを開くことです。しかし、うまくいきません。

通知をクリックしても何も起こりません。

次のような通知を作成しています。

var q = chrome.notifications.create({
		"type": "basic",
		"iconUrl": chrome.extension.getURL("128-128q.png"),
		"title": 'title',
		"message": 'content'
	});
	
chrome.notifications.onClicked.addListener(function(notificationId) {
    window.open('http://www.google.com');
});
browser.notifications.onClicked.addListener(function(notificationId) {
    window.open('http://www.google.com');
});
	
q.onClicked.addListener(function(notificationId) {
    window.open('http://www.google.com');
});
	
var audio = new Audio('message.mp3');
audio.play();

どうすればこれを機能させることができますか?

4

1 に答える 1

1

問題は、機能しない方法で新しい URL を開こうとしていることにあるようです。

を使用して、以下が機能するはずchrome.tabs.create()です。

var q = chrome.notifications.create("MyExtensionNotificationId", {
        "type": "basic",
        "iconUrl": chrome.extension.getURL("128-128q.png"),
        "title": 'title',
        "message": 'content'
    });

chrome.notifications.onClicked.addListener(function(notificationId) {
    chrome.tabs.create({url:"http://www.google.com"});
});

chrome.notifications.onClicked()ただし、サポートが最近追加されたばかりなので、Firefox 47.0+ でこれをテストする必要があります。Firefox 47.0+ に関する私の声明は、互換性テーブルに基づいています。ただし、互換性テーブルには少なくとも 1 つの明確なエラーがあります。したがって、Firefox の上位バージョンが必要になる場合があります。私がテストしたコードは、Firefox Nightly バージョン 50.0a1 では機能しましたが、Firefox Developer Edition バージョン 48.0a2 では正しく機能しませんでした。一般に、WebExtensions API が活発に開発されていることを考えると、期待どおりに機能しない質問や問題がある場合は、Firefox Nightly に対してテストする必要があります。API のソース コードをチェックして、実際に実装されているものと追加された時期を確認することもできます。

注:これは または のいずれchrome.notifications.onClickedかで機能しますbrowser.notifications.onClicked。ただし、同じことを行う 2 つの別個の無名関数を追加するために両方を使用しないでください。そうすると、実行していることが 2 回発生することになります。

あなたのコードで実際にテストしたわけではありませんが、notify-link-clicks-i18n WebExtensions exampleの修正版でテストしました。その例のbackground-script.jsファイルを次のように変更しました。

/*
Log that we received the message.
Then display a notification. The notification contains the URL,
which we read from the message.
*/
function notify(message) {
    console.log("notify-link-clicks-i18n: background script received message");
    var title = chrome.i18n.getMessage("notificationTitle");
    var content = chrome.i18n.getMessage("notificationContent", message.url);
    let id = "notify-link-clicks-i18n::" + title + "::" + message.url;
    chrome.notifications.create(id,{
        "type": "basic",
        "iconUrl": chrome.extension.getURL("icons/link-48.png"),
        "title": title,
        "message": content
    });
}

/*
Assign `notify()` as a listener to messages from the content script.
*/
chrome.runtime.onMessage.addListener(notify);

//Add the listener for clicks on a notification:
chrome.notifications.onClicked.addListener(function(notificationId) {
    console.log("Caught notification onClicked with ID:" + notificationId);
    //Open a new tab with the desired URL:
    browser.tabs.create({url:"http://www.google.com"});
});

一意のID が可能なこのようなものに対する私の好みは、通知がアドオンによって表示されたことと通知の内容の両方を識別する一意の ID を提供することです。これにより、リスナー関数は、アドオンによって表示された通知および/または表示された通知のサブセットのみに作用するか、または通知を表示した理由に基づいて異なる動作を行うかを選択できます。

ここで何が機能していないかを理解するのに苦労した理由は、おそらく、問題を実証するために必要な最小限に問題を減らしていなかったためです。つまり、通知の onClicked リスナーとは別に新しい URL を開いてconsole.log()、リスナー内で a を試してみることをお勧めします。

于 2016-06-09T12:02:01.360 に答える