2017-03-10 2 views
1

チャットにメッセージの種類が表示されたときに音を出すTampermonkeyのコードを試していました。Tampermonkeyスクリプトは、最初の新しいノードでのみ動作します

問題は、このスクリプトは最初のメッセージでのみ機能し、毎回機能するようにしたいということです。

私はインターネットを通して探していましたが、おそらく「iFrames」と呼ばれるものがあることがわかりました。

スクリプト:

// ==UserScript== 
// @name   New Userscript 
// @namespace http://tampermonkey.net/ 
// @version  0.1 
// @description Sound when chat message 
// @author  You 
// @include  * 
// @grant  none 
// ==/UserScript== 

var exist = false; 
var notified = false; 
mCoinSound = new Audio("https://dl.dropbox.com/u/7079101/coin.mp3"); 

setInterval(getRain, 2000); 

function getRain() { 
    var rain = document.getElementsByClassName('rain-message'); 
    exist = rain.length === 0 ? false : true; 
    notified = (exist && notified); 

    if (exist && !notified) { 
     mCoinSound.play(); 
     notified = true; 
    } 
} 
+0

ここで 'setInterval'とは何と思いますか? – jmargolisvt

+0

@jmargolisvt コードを繰り返して、メッセージが表示されたら2秒ごとにチェックするのに使用しました。 – Prodx9

答えて

0

あなたがそれぞれの新しいrain-messageノードに対して一度サウンドを再生したいので、notifiedのようなグローバル状態ブーリアンが動作しません。

各ノードに個別にマークを付ける必要があります。いろいろな方法がありますが、waitForKeyElements()を使って行う方法を示します.AJAXノードとwaitForKeyElementsノードを自動的にマークするのを待つ必要があるためです。

次は、音を1秒に何回も再生することを避けることです。私はそのために "デバウンス"機能を使用します。

最後に、@include *を使用しないでください。

このスクリプトはすべてまとめてTampermonkey &Daggerで動作します。

// ==UserScript== 
// @name  _Play Sound on new chat message 
// @match *://YOUR_SERVER.COM/YOUR_PATH/* 
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js 
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js 
// @grant GM_addStyle 
// ==/UserScript== 
//- The @grant directive is needed to restore the proper sandbox. 

let mCoinSound = new soundObj ('https://dl.dropbox.com/u/7079101/coin.mp3'); 

waitForKeyElements (".rain-message", playSound); 

function playSound (jNode) { 
    mCoinSound.playDbnc(); 
} 

function soundObj (audioURL) { 
    let dbncTimer = null; 
    let audioObj = new Audio(audioURL); 

    this.playDbnc = function() { // "Debounce" function 
     if (dbncTimer) return; 

     dbncTimer = setTimeout (resetTimer, 1111); 
     audioObj.play(); 
    }; 

    function resetTimer() { 
     clearTimeout (dbncTimer); 
     dbncTimer = null; 
    } 
} 




&ダガー。 Firefoxはユーザーの介入なしに音を鳴らすことに問題があり、手動でクリックすると「準備」する必要があります。

+0

作業中!タイはそんなに! – Prodx9

+0

あなたは大歓迎です!喜んで助けてください。 –

関連する問題