Javascript 代码在没有警报的情况下无法工作,否则它可以完美运行


Javascript code that doesn't work without an alert before it, otherwise it works perfectly

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

我正在开发一个 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 事件,但如果您希望它在加载或某些自动事件时运行,那么它会失败)。 现在我没主意了。

我希望得到一个答案,因为我相信这段代码可以帮助那些一直试图获得某种恢复音频功能的人,这些功能使用起来并不笨重或令人困惑。 :)我一直在努力寻找解决方案,但从未如此接近。感谢您的阅读。如果你想要整个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'">";
  }
 }



它现在似乎工作得很好。我改变了一些东西,现在按照我想要的方式工作。感谢您的帮助!:)

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

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

此外,线路window.onload=settimecookie();是错误的。 settimecookie 在执行 beeing 时不返回事件处理程序函数。