Javascript代码在没有警报之前无效,否则它完美无缺

时间:2012-05-23 18:28:25

标签: php javascript html5-audio

在问一个问题之前,我试图真正看一下这个问题,但看起来我在这里遇到了问题,并希望看到有人知道这个问题有明确的答案。我看过一两个类似的问题,但他们似乎没有指出我的问题,或者至少我不明白他们的目的是什么。

我正在研究RPG系统音频PHP功能,该功能在呼叫时播放音乐,如果用户没有静音音乐选项则使用音频标签。 (在函数$ song中是第一个参数中的歌曲。)现在,如果调用此函数使其恢复为真,那么它将使用一些javascript。请原谅代码,因为它有点乱(对我来说)但是这里有以下代码,其中包含javascript代码:

function playmusic($song, $resume=false, $loop=true)
 {
  global $baseurl, $loggeduser;

 if ($resume == true)
  {
   $buttons = "
    <button onclick=\"resetplaytime()\" type=\"button\">Reset</button>
    <button onclick=\"alertplaytime()\" type=\"button\">Alert Time</button>";
   $resume = "
    <script type=\"text/javascript\">
      var curmusic_$song = document.getElementById(\"music_$song\");
      var musictime = getcookie(\"musicplaytime_$song\");

     if (musictime != null && musictime != \"\")
      {
       alert(musictime);
       curmusic_$song.currentTime = musictime; 
      }

      window.onload=settimecookie();

     function getcookie(c_name)
      {
       var i,x,y,ARRcookies=document.cookie.split(\";\");
      for (i=0;i<ARRcookies.length;i++)
       {
        x=ARRcookies[i].substr(0,ARRcookies[i].indexOf(\"=\"));
        y=ARRcookies[i].substr(ARRcookies[i].indexOf(\"=\")+1);
        x=x.replace(/^\s+|\s+$/g,\"\");
       if (x==c_name)
        {
         return unescape(y);
        }
       }
      }

     function settimecookie()
      {
       var playtime = curmusic_$song.currentTime;
      if (playtime != null && playtime != \"\")
       {
        document.cookie = 'musicplaytime_$song=' + playtime;
       }

       setTimeout(\"settimecookie()\", 50);
      }

     function alertplaytime()
      {
       alert(musictime);
      }

     function resetplaytime()
      {
       curmusic_$song.currentTime=0;
      }

    </script>";
  }

 if ($loop == true)
  {
   $songloop = " loop=\"true\"";
  }

 if ($loggeduser['mutemusic'] == 0)
  {
   return "
    </table>
    $buttons
    <audio id=\"music_$song\" autoplay=\"true\"$songloop preload=\"true\">
      <source src=\"$baseurl/boardfiles/effects/$song.ogg\" type=\"audio/ogg\" />
      <source src=\"$baseurl/boardfiles/effects/$song.mp3\" type=\"audio/mp3\" />
    </audio>
    $resume
    <table class=\"brdr\" cellpadding=\"0\">";
  }
 }

现在,如果我从循环中取出警报,将音频标签的播放时间设置为cookie值,则整个脚本不起作用(如同没有做的那样),除非您使用按钮直接调用其中一个函数然后该功能起作用。

我尝试了一些功能,使其成为一个函数并直接调用它(它似乎只适用于onclick事件,但如果你希望它在onload或某些自动事件时运行,那么它会失败。),移动它稍后在函数中(以及settimecookie()的onload,因为它必须在此之后,因为它将cookie设置为当前的播放时间),现在我没有想法。

我希望能得到一个答案,因为我确信这段代码可以帮助那些一直试图获得某种恢复音频功能的人,这种功能并不笨重或难以使用。 :) 我一直试图找到一个解决方案很长一段时间,从来没有这么接近。谢谢你的阅读。如果您想要整个PHP函数,那么我也会展示它,但除了两个调试按钮(重置和警报cookie)和带有id“music_ $ song”的音频标签之外,没有什么可看的。

编辑:为了清楚起见,在代码中,双引号之前有转义,因为在PHP函数中返回了javascript。

编辑2:现在已经加入了这个编辑,因为有些人已经错过了。另外我添加了PHP部分。




最后一次编辑:我现在似乎想出了一些让我更接近我希望实现的东西。我将上面的代码更改为以下代码,它对我来说完美无缺。

function playmusic($song, $resume=false, $loop=true)
 {
  global $baseurl, $loggeduser;

 if ($resume == true)
  {
   $resume = "
    <!--
    <button onclick=\"resetplaytime();\" type=\"button\">Reset</button>
    <button onclick=\"alertplaytime();\" type=\"button\">Alert Time</button>
    <button onclick=\"settimecookie();\" type=\"button\">Start Cookie tracking</button>
    -->

    <script type=\"text/javascript\">
     function getcookie(c_name)
      {
       var i,x,y,ARRcookies=document.cookie.split(\";\");
      for (i=0;i<ARRcookies.length;i++)
       {
        x=ARRcookies[i].substr(0,ARRcookies[i].indexOf(\"=\"));
        y=ARRcookies[i].substr(ARRcookies[i].indexOf(\"=\")+1);
        x=x.replace(/^\s+|\s+$/g,\"\");
       if (x==c_name)
        {
         return unescape(y);
        }
       }
      }

     function settimecookie()
      {
       var curmusic_$song = document.getElementById(\"music_$song\");
       var playtime = curmusic_$song.currentTime;
      if (playtime != null && playtime != \"\")
       {
        document.cookie = \"musicplaytime_$song=\" + playtime;
       }

       setTimeout(\"settimecookie()\", 50);
      }

     function resumeplaytime()
      {
       var curmusic_$song = document.getElementById(\"music_$song\");
       var musictime = getcookie(\"musicplaytime_$song\");
      if (musictime != null && musictime != \"\")
       {
        curmusic_$song.currentTime = musictime; 
       }
       curmusic_$song.play(); 

       settimecookie();
      }

      window.onload=resumeplaytime;

     function alertplaytime()
      {
       var musictime = getcookie(\"musicplaytime_$song\");
       alert(musictime);
      }

     function resetplaytime()
      {
       var curmusic_$song = document.getElementById(\"music_$song\");
       curmusic_$song.currentTime=0;
      }

    </script>";
  }
 else
  {
   $autoplay = "autoplay=\"true\"";
  }

 if ($loop == true)
  {
   $songloop = " loop=\"true\"";
  }

 if ($loggeduser['mutemusic'] == 0)
  {
   return "
    </table>
    $resume
    <audio id=\"music_$song\" $autoplay$songloop preload=\"true\">
      <source src=\"$baseurl/boardfiles/effects/$song.ogg\" type=\"audio/ogg\" />
      <source src=\"$baseurl/boardfiles/effects/$song.mp3\" type=\"audio/mp3\" />
    </audio>
    <table class=\"brdr\" cellpadding=\"0\">";
  }
 }



它现在看起来很完美。我改变了一些东西,现在按照我的意愿工作。谢谢您的帮助! :)

1 个答案:

答案 0 :(得分:2)

看起来您尝试在DOM可用之前执行document.getElementById("music_$song")。为此使用onload处理程序。

然而,我找不到任何可以让你等待的alert()alertplaytime()的电话 - 尤其不是你所描述的循环。

此外,第window.onload=settimecookie();行还有错误。当执行时,settimecookie不会返回事件处理函数。