2017-03-10 2 views
1

Ich habe gerade versucht Code in Tampermonkey, der einen Ton macht, wenn eine Art von Nachricht in einem Chat erscheint.Tampermonkey Skript funktioniert nur auf dem ersten neuen Knoten

Das Problem ist, dass dieses Skript nur auf die erste Nachricht funktioniert und ich möchte es jedes Mal arbeiten lassen.

Ich habe durch das Internet gesucht und ich habe festgestellt, dass vielleicht weil etwas namens "iFrames" ??

Das Skript:

// ==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

Was denkst du, setInterval' macht hier? – jmargolisvt

+0

@jmargolisvt Ich habe es verwendet, um den Code zu wiederholen und alle 2 Sekunden zu überprüfen, ob die Nachricht erschienen ist – Prodx9

Antwort

0

Da der Ton einmal für jeden neuen rain-message Knoten, ein globaler Zustand boolean wie notified wird nicht funktionieren, spielen möchten.

Sie müssen jeden Knoten einzeln markieren. Es gibt eine Vielzahl von Möglichkeiten, das zu tun, aber ich werde zeigen, wie man es mit waitForKeyElements() macht - da Sie auch auf AJAX'd-Knoten warten müssen und waitForKeyElements Knoten automatisch markiert.

Die nächste Sache ist es zu vermeiden, den Ton mehrmals pro Sekunde zu spielen. Ich werde dafür eine Entprellfunktion verwenden.

Schließlich nicht @include * verwenden.

Alles zusammen sollte dieses Skript auf Tampermonkey & Dagger funktionieren;:

// ==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; 
    } 
} 




& Dagger; Firefox hat Probleme beim Abspielen von Sounds ohne Benutzerinteraktion und muss mit einem manuellen Klick "vorbereitet" werden.

+0

Arbeiten! Vielen Dank! – Prodx9

+0

Gern geschehen! Froh, dass ich Helfen kann. –

Verwandte Themen