2016-04-21 24 views
3

ターゲットページに特定のコンテンツが存在する場合、通知をポップアップするuserscriptがあります。ユーザースクリプトの通知はFirefoxではなくChromeで動作しますか?

Tampermonkey/Chromeでは、これは問題ではありません。 GM_Notification()関数を使用して簡単に通知を作成できます。

Firefoxでこれを実行しようとすると、同じ動作はまったくありません。
ログをチェックインすると、機能に関するエラーはなく、通知もポップアップしません。ここで

は、Firefox + GreasemonkeyのまたはFirefox + Tampermonkeyでは動作しませんいくつかのサンプルコードですが、クローム+ Tampermonkeyで作業を行います。

// ==UserScript== 
// @name  Test Notifier 
// @include  * 
// @grant  GM_notification 
// @grant  window.focus 
// ==/UserScript== 

console.log('I am a pretty test script'); 

var notificationDetails = { 
    text: 'THIS IS A TEST NOTIFICATION!!!', 
    title: 'TEST', 
    timeout: 15000, 
    onclick: function() { window.focus(); }, 
    }; 
GM_notification(notificationDetails); 

は、Firefoxのためのこの標準の動作ですか? HTML5通知をまったく異なる方法で処理しますか? Firefoxのユーザースクリプトで通知を有効にする一般的な方法は何ですか?

+0

のFirefox 46は現在安定しており、GM_Notificationはまだこの時点でTampermonkey内で動作しません。しかし、あなたが提供しているコードは完全に動作するので、私はそれを正しい答えとして受け入れます:) – Saintwolf

答えて

9

GM_notification() is not (yet) supported in Greasemonkey (Firefox)。あなたがchecked the error consoleを持っていたなら、あなたはこのエラーを見ているだろう:

GM_notification is not defined

のGreasemonkeyへan old feature request to add GM_notification()があります。そこに行って、リードGM開発者にTampermonkeyに追いついてみるように促すことができます。 :)

多くの最新のブラウザでサポートされているthe HTML5(ish) Notifications APIを使用すると、その機能が追加されるまで、GM_notificationのサポートを「シム」することができます。

シムが追加されたテストスクリプトは、次のとおりです。 FirefoxとChromeの両方でテストが、はあまりにもSafariとOperaの上作業する必要があります

// ==UserScript== 
// @name  _Cross browser notifications 
// @match  http://YOUR_SERVER.COM/YOUR_PATH/* 
// @grant  GM_notification 
// @grant  window.focus 
// ==/UserScript== 

console.log ('Test script start.'); 

shim_GM_notification() 

var notificationDetails = { 
    text:  'Test notification body.', 
    title:  'Test notice title', 
    timeout: 6000, 
    onclick: function() { 
     console.log ("Notice clicked."); 
     window.focus(); 
    } 
    }; 
GM_notification (notificationDetails); 

/*--- Cross-browser Shim code follows: 
*/ 
function shim_GM_notification() { 
    if (typeof GM_notification === "function") { 
     return; 
    } 
    window.GM_notification = function (ntcOptions) { 
     checkPermission(); 

     function checkPermission() { 
      if (Notification.permission === "granted") { 
       fireNotice(); 
      } 
      else if (Notification.permission === "denied") { 
       alert ("User has denied notifications for this page/site!"); 
       return; 
      } 
      else { 
       Notification.requestPermission (function (permission) { 
        console.log ("New permission: ", permission); 
        checkPermission(); 
       }); 
      } 
     } 

     function fireNotice() { 
      if (! ntcOptions.title) { 
       console.log ("Title is required for notification"); 
       return; 
      } 
      if (ntcOptions.text && ! ntcOptions.body) { 
       ntcOptions.body = ntcOptions.text; 
      } 
      var ntfctn = new Notification (ntcOptions.title, ntcOptions); 

      if (ntcOptions.onclick) { 
       ntfctn.onclick = ntcOptions.onclick; 
      } 
      if (ntcOptions.timeout) { 
       setTimeout (function() { 
        ntfctn.close(); 
       }, ntcOptions.timeout); 
      } 
     } 
    } 
} 
関連する問題