-2

私は数日間JSを学んでいます。stackoverflow は大きな助けになりました。しかし、私は判断も説明もできない問題を思いつきました(私はこれに慣れていないため)。

< audio > ベースの mp3 プレーヤーを作成しました。自分で見て/試してみる必要があります。(ごめん)

ここで JS コードを確認してください - その中の ctrl-f 'STACKoverflow' - AntonFrolov.net/music.php

問題がどこにあるかを確認するために実行する必要があるアクションは次のとおりです(これらもウェブサイトに掲載しました)。

  1. トラック #2 をクリックします - アラートが表示されます ('トラック #' +ID); = [トラック #2]
  2. 右下隅にプレイヤーがいます - トラックの進行状況を 98% に設定して終了します。
  3. (ID++)、トラック #3 に送信されます。alert('トラック番号' +ID); = [トラック #3]。良い。
  4. 手順 2 を繰り返します。
  5. (ID++)、トラック #4 に送信する必要があります。... 問題のイベント:

    • 5a. alert('トラック番号' +ID); = [トラック #3]。
    • 5b. トラック #3 が再生を開始します。また。次に、すぐに次の..アラートを受け取ります
    • 5c。alert('トラック番号' +ID); = [トラック #4]。
    • 5d. トラック #4 が再生を開始します。それは私が期待したことですが、イベント5a-5bはありません。

手順を実行し続けると、これが続きます。

ただし、JS コードは次のとおりです。

    function FuncPlay(ID,Rnd){
    alert('Track #'+ID);
    if (Rnd==0){
    $('.liActive').removeClass('liActive');
    $('#'+ID).next().addClass('liActive');


    // Set track Data
    $('audio').attr('id','audioNor');
    $('audio').attr('src',$('.liActive').attr('rel'));

    // Play
    var player = $('.tbd').get(0);
    player.play();
    $('#pause').removeClass('hi');
    ID++;
        $(player).bind('ended', function () { 
                if (ID <= <?php echo $am ?>){FuncPlay(ID, 0);}
                else {alert('"...End of the list."' );}
        });
    }
}

これに対処する方法がまったくわかりません。お待ちいただいてありがとうございます。

4

2 に答える 2

2

ended問題は、 -handler をプレーヤーに複数回バインドしていることだと思います。FuncPlay が呼び出されるたびに、もう一度アタッチされます。たとえば、トラック 5 が開始すると、最初にトラック 3 のハンドラが呼び出され、次にトラック 4、最後にトラック 5 が呼び出されます。

あなたができることは、呼ばれるグローバル変数を作成し、呼び出されIDたときにのみハンドラーにバインドすること document readyです。ハンドラ関数では、このグローバル変数を参照します。または、 を呼び出す前$(player).bindに、playersendedイベントへのすべてのバインドを削除します。

また、後方互換性のために を使用することをお勧めし.on()ます.bind()。イベントハンドラのバインドを解除するメソッドは.off()/.unbind()です。

于 2013-11-04T10:50:10.680 に答える
0

「終了した」イベントリスナーのバインドを解除しません。Is は 2 番目の曲の終わりに 2 回、3 番目の曲の終わりに 3 回呼び出されます。

于 2013-11-04T10:47:04.423 に答える