我只是在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 :(得分:0)
由于您希望为每个新rain-message
节点播放一次声音,因此像notified
这样的全局状态布尔值无法正常工作。
您需要单独标记每个节点。有很多方法可以做到这一点,但我将展示如何使用waitForKeyElements()
来完成它 - 因为你还需要等待AJAX节点和waitForKeyElements自动标记节点。
接下来就是避免每秒多次播放声音。我会使用" debounce"这个功能。
最后,请勿使用@include *
。
总而言之,这个脚本应该适用于Tampermonkey ‡:
// ==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在没有用户交互的情况下播放声音时出现问题,需要启动#34;手动点击。