0

在提出问题之前,我已经尝试过真正查看这个问题,但看起来我在这里陷入困境,想看看是否有人知道这个问题的明确答案。我见过一两个类似的问题,但他们似乎没有指出我的问题,或者至少我不明白他们的目的。

我正在开发一个 RPG 系统音频 PHP 函数,该函数在被调用时播放音乐,如果用户没有静音音乐选项,它会使用音频标签。(在函数 $song 中是第一个参数中的歌曲。)现在,如果调用此函数以使 resume 为真,那么它使用一些 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' 的音频标签之外,真的什么都看不到。

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

编辑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\">";
  }
 }



它现在似乎工作得很好。我改变了一些东西,现在可以按我的意愿工作。谢谢您的帮助!:)

4

1 回答 1

2

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

然而,我找不到任何调用alert()alertplaytime()让那个等待 - 尤其是不像你所描述的那样在循环中。

另外,线路window.onload=settimecookie();有问题。settimecookie执行时不返回事件处理函数。

于 2012-05-23T18:41:36.913 回答