可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I want my chrome extension to take a notification.id
, and:
- Update an existing notification if it does exist. OR
- Create a new notification if it doesn't exist.
Calling clear()
then create()
is not ideal, since the animation is visually jarring for both remove()
and create()
methods, where I want to update without animations. Plus, obviously, calling update()
on a disappeared notification doesn't do anything.
Is there an easy way to implement this?
回答1:
Edit: This approach no longer works on any platform except ChromeOS due to the removal of Chrome's Notification Center.
Possible ideas to work around it include using requireInteraction: true
flag on notifications to fully control notification lifetime.
There is a dirty trick for re-showing a notification. If you change a notification's priority to a higher value, it will be re-shown if it exists.
function createOrUpdate(id, options, callback) { // Try to lower priority to minimal "shown" priority chrome.notifications.update(id, {priority: 0}, function(existed) { if(existed) { var targetPriority = options.priority || 0; options.priority = 1; // Update with higher priority chrome.notifications.update(id, options, function() { chrome.notifications.update(id, {priority: targetPriority}, function() { callback(true); // Updated }); }); } else { chrome.notifications.create(id, options, function() { callback(false); // Created }); } }); }
回答2:
Xan's answer no longer works on Windows, MacOS, or Linux. At this point the only way to make sure your notification displays, no matter what, is to create a new notification.
If you want to prevent multiple notifications from being on screen, you'll have to clear the old notification and replace it with a new one. This is demonstrated below.
NOTIFICATION_ID = "some_random_string"; function showNotification ( ... , callback) { chrome.notifications.clear(NOTIFICATION_ID, function(cleared) { var options = { // whatever }; chrome.notifications.create(NOTIFICATION_ID, options, callback); }); }
Of course, this results in an animation of existing notification getting dismissed and a new notification immediately taking its place, but unfortunately this is unavoidable.