Tampermonkey脚本仅在第一个新节点上工作

时间:2017-03-10 02:27:13

标签: javascript 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;
    }
}

1 个答案:

答案 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;手动点击。