【问题标题】:Reduce delays after playing a sound onclick?播放声音 onclick 后减少延迟?
【发布时间】:2012-10-23 04:42:39
【问题描述】:

我正在尝试制作一个带有按钮的网站(使用 JavaScript),如果有人点击它,它就会播放声音。

但问题是当我点击按钮时,它会等待(我猜是加载)几秒钟,然后播放声音。如果声音说“你好”并且有人不断点击它,我希望它播放“他-他-他-他-他-你好”。

按钮是.png,我也有一个按下按钮的动画。

每个代码调用四个函数。那么这是一个效率问题吗?有人可以建议我更好的方法吗?

<html>
    <body>
<title>Title</title>

 <head>
        <style type="text/css">
         body{
         background: url('noisy_grid.png');
         background-repeat: repeat;
         }
        </style>

    <script language="javascript" type="text/javascript">
 <!--
// PRELOADING IMAGES
if (document.images) {
 btn1_down=new Image(); btn1_down.src="img1_down.png"; 
 btn1_up  =new Image(); btn1_up.src  ="imag1_up.png"; 

 btn2_down=new Image(); btn2_down.src="img2_down.png"; 
 btn2_up  =new Image(); btn2_up.src  ="img2_up.png"; 

 btn3_down=new Image(); btn3_down.src="imag3_down.png"; 
 btn3_up  =new Image(); btn3_up.src  ="img3_up.png"; 

  btn4_down=new Image(); btn4_down.src="img4_down.png"; 
 btn4_up  =new Image(); btn4_up.src  ="img4_up.png"; 

  btn5_down=new Image(); btn5_down.src="img5_down.png"; 
 btn5_up  =new Image(); btn5_up.src  ="img5_up.png"; 

  btn6_down=new Image(); btn6_down.src="img6_down.png"; 
 btn6_up  =new Image(); btn6_up.src  ="img6_up.png"; 

}

// EVENT HANDLERS
function pressButton(btName) {
 if (document.images)
  eval('document.'+btName+'.src='+btName+'_down.src');
}
function releaseButton(btName) {
 if (document.images)
  eval('document.'+btName+'.src='+btName+'_up.src');
}

function playSound(soundfile) {
document.getElementById("dummy").innerHTML=
    "<embed src=\""+soundfile+"\" hidden=\"true\" autostart=\"true\" loop=\"false\" />";
}

 -->
    </script>
 </head>

 <span id="dummy"></span>
<center>
<br>
 <a onMouseDown="pressButton('btn1');" 
      onMouseUp="releaseButton('btn1');" 
      onMouseOut="releaseButton('btn1');" 
      onclick="playSound('sound1.mp3');"><img name=btn1 src="img1_up.png" /></a>

<a onMouseDown="pressButton('btn2');" 
      onMouseUp="releaseButton('btn2');" 
      onMouseOut="releaseButton('btn2');" 
      onclick="playSound('sound2.mp3');"><img name=btn2 src="img2_up.png" /></a>


<a onMouseDown="pressButton('btn3');" 
      onMouseUp="releaseButton('btn3');" 
      onMouseOut="releaseButton('btn3');" 
      onclick="playSound('sound3.mp3');"><img name=btn3 src="img3_up.png" /></a>
</br>
 <br>
<a onMouseDown="pressButton('btn4');" 
      onMouseUp="releaseButton('btn4');" 
      onMouseOut="releaseButton('btn4');" 
      onclick="playSound('sound4.mp3');"><img name=btn4 src="img4_up.png" /></a>


<a onMouseDown="pressButton('btn5');" 
      onMouseUp="releaseButton('btn5');" 
      onMouseOut="releaseButton('btn5');" 
      onclick="playSound('sound5.mp3');"><img name=btn5 src="img5_up.png" /></a>

<a onMouseDown="pressButton('btn6');" 
      onMouseUp="releaseButton('btn6');" 
      onMouseOut="releaseButton('btn'6);" 
      onclick="playSound('sound6.mp3');"><img name=btn6 src="img6_up.png" /></a>
</br>

</center>


    </body>
</html>

【问题讨论】:

  • 您没有包含按钮和音频代码,这实际上是与此问题唯一相关的内容。按钮加载功能不太可能是问题的一部分。您更有可能只在点击时加载音频内容,而应该直接与页面一起加载。请包含所有相关代码。
  • 每次嵌入声音时都需要重新加载,因此您很可能总是会遇到延迟,因此您必须预加载声音 - 我还建议使用 SoundManager2 之类的播放器。跨度>
  • 为什么不预加载声音呢?使用具有唯一 id 的嵌入标签,然后使用 document.geElementById("unique").play()
  • jb// 感谢 cmets。这就是我所拥有的一切。我说的是按钮,但它实际上是一个图像,当您单击它时,它会变为另一个图像,如果您取消单击它,它会返回到原始图像。我不确定您所说的音频代码是什么意思。 playSound 函数是播放音频的唯一代码。以及如何让音频内容直接加载?
  • Shannon// 正如我所说,我对网络脚本没有任何经验,所以我会搜索一下。

标签: javascript


【解决方案1】:

哇,真的有必要吗?评估?嵌入? 真的吗?

试试这个:

<!DOCTYPE HTML>
<html> 
<head> 
    <title>Title</title> 
    <style type="text/css"> 
        body{ 
            background: url('noisy_grid.png'); 
            background-repeat: repeat; 
        } 
    </style> 
</head>
<body>
    <center id="container"></center> 
    <script type="text/javascript">
        (function() {
            var images = {}, pressButton, releaseButton, playSound, i, a, aud, img,
                container = document.getElementById('container');
            // preload images
            for( i=1; i<=6; i++) {
                (images[i+'d'] = new Image()).src = "img"+i+"_down.png";
                (images[i+'u'] = new Image()).src = "img"+i+"_up.png";
            }

            // event handlers
            pressButton = function(btn) {
                btn.firstChild.src = images[btn.btnid+'d'].src;
            }
            releaseButton = function(btn) {
                btn.firstChild.src = images[btn.btnid+'u'].src;
            }
            playSound = function(btn) {
                btn.nextSibling.play();
            }

            for( i=1; i<=6; i++) {
                a = document.createElement('a');
                img = document.createElement('img');
                aud = document.createElement('audio');

                if( !aud.canPlayType || aud.canPlayType("audio/mpeg") == ""
                          || aud.canPlayType("audio/mpeg") == "no") {
                    alert("Sorry, your browser does not support MP3.");
                    return;
                }

                a.onmousedown = function() {pressButton(this);};
                a.onmouseup = a.onmouseout = function() {releaseButton(this);};
                a.onclick = function() {playSound(this);};
                a.btnid = i;
                img.src = images[i+'u'].src;
                aud.src = "sound"+i+".mp3";

                container.appendChild(a);
                a.appendChild(img);
                container.appendChild(aud);
            }
        })();
    </script>
</body> 
</html> 

我已经完全重写了你的代码,让它从上个千年发展到现在。如果您在了解其工作原理方面需要帮助,请通过具体问题告诉我。

【讨论】:

  • 老实说,我并不完全了解所有内容。我看到您有变量和循环来删除重复项,并且我知道子/兄弟属性的作用,但是 windows 是从哪里来的?我也测试了代码,但是当我点击图片时它什么也没做。
  • 我在发布后不久编辑了答案。您可能使用的是旧版本的代码,但确实存在一些错误。它现在应该可以工作了。
  • 哦,好吧,我看到对代码进行了一些更改。我用谷歌搜索了windows,我猜它是javascript的一个全局对象。我已经在不同的浏览器中再次测试了代码,现在它似乎工作正常。谢谢你
  • window 是 全局对象。在您的旧代码中,window.btn1_down 将是您在 btn1_down 变量中定义的图像。我给出的代码没有全局变量,这通常被认为是一件好事。
  • 我还有一个问题。现在 a.onclick 正在调用 playSound 函数,但是有没有办法在它仍在执行时重新启动它?就像当我点击一个按钮时它会播放声音,但是当我再次点击它时(当它仍在播放声音时)它会从头开始播放。
猜你喜欢
  • 2012-06-20
  • 1970-01-01
  • 2011-05-09
  • 2018-07-19
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
相关资源
最近更新 更多