0

私は質問をする前にこれを実際に調べようとしましたが、私はここで拘束されているようで、誰かがこの問題に対する明確な答えを知っているかどうかを確認したいと思います。私は1つか2つの似たような質問を見てきましたが、彼らは私の問題を指摘していないようでした、あるいは少なくとも私は彼らが何をしようとしているのか理解していませんでした。

私は、呼び出されたときに音楽を再生するRPGシステムオーディオPHP関数に取り組んでおり、ユーザーがミュートで音楽オプションを持っていない場合はオーディオタグを使用します。(関数内の$ songは、最初の引数にスローされる曲です。)ここで、この関数がtrueになるように呼び出された場合、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値に設定するループからアラートを取得すると、ボタンを使用して関数の1つを直接呼び出してから、ボタンを使用しない限り、スクリプト全体が機能しません(何も行われていない場合など)。機能が動作します。

これを関数にして直接呼び出すことからいくつかのことを試しました(onclickイベントでのみ機能するようですが、onloadまたは何らかの自動イベント中に実行されると予想される場合は失敗します)、後で移動します関数(これは、Cookieを現在の再生時間に設定するため、この後でなければならないため、settimecookie()のonloadと一緒に)、そして今、私はアイデアがありません。

このコードは、かさばったり、使用するのが混乱したりしない、ある種の履歴書オーディオ機能を取得しようとしている他の人に役立つと確信しているので、私はこれに対する答えを得ることを望んでいます。:)私はかなり長い間解決策を見つけようとしてきましたが、これほど近くにいることはありませんでした。読んでくれてありがとう。PHP関数全体が必要な場合は、それも表示しますが、2つのデバッグボタン(リセットとアラート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();はバグがあります。settimecookiebeeingの実行時にイベントハンドラー関数を返しません。

于 2012-05-23T18:41:36.913 に答える