2011-12-20 14 views
0

私は自分のウェブサイトでオーディオプレーヤーを作成しました。時間に基づいてリスト項目を表示する

再生中のトラックに時間ベースのコメントが付いていて、トラックの進行状況がコメントのタイムスタンプに当たったときに表示させたい場合があります。

設定はulで、コメントはliとなります。 liはデフォルトでは表示されません。コメントのタイムスタンプをliのデータ属性に追加しました。

例:

<ul class="comments"> 
    <li data-timestamp="0">Check my page fans : http://www.facebook.com/ITBFLR</li> 
    <li data-timestamp="185525">great sub!</li> 
    <li data-timestamp="256931">@greenmono: Haha thank's dude</li> 
    <li data-timestamp="497073">Wicked mix de ;)</li> 
</ul> 

トラック(100 +)に多くのコメントが存在する場合があります。私のプレーヤーは、ミリ秒単位で現在のトラック進行を返します。

liすべてを現在のトラックの進行状況よりも小さいタイムスタンプで一致させるセレクタを使用できますか?

jQuery用のカスタムセレクタプラグインがいくつかあります(たとえばA better data selector for jQuery)が、これは大きなボトルネック(パフォーマンスが賢明)かどうか疑問に思っています。

So:このソリューションを使用するのが賢明でしょうか、間違っていますか?

+3

現在のソリューションのパフォーマンスに関係なく、バイナリ検索ツリーまたは同様のデータ構造を作成することができます。これにより、特定の値よりも小さい要素を簡単に選択できますキーはタイムスタンプ、値はDOMノードへの参照、または挿入しなければならないコメントだけです)。または、優先順位キューとしてminヒープを使用し、常に最初の項目を削除します。このような方法でデータを保存すると、他のこともできるようになります。ちょうど私の考え... :) –

+3

あなたはそれらを表示する前に、サーバー側でこれらをソートしていない理由はありますか?クライアントでこれを行わないのが最善です。 – asawilliams

+0

@asawilliams nopezそれは私に悪い例を示しているだけです:P – PeeHaa

答えて

0

いつでもDOMをオンロードして内部オブジェクトにデータを保存することができます。次に、DOMに触れたり移動したりすることなく、必要なときに関連するデータを取得します。この仕事かもしれないような

何か:

var data = [], 
    i = 0; 

$(function() { 
    $('.comments').find('li').each(function() { 
     data.push({ 
      ts: this.getAttribute('data-timestamp'), 
      el: $(this).hide() 
     }); 
    }); 
}); 

onProgress(function(timestamp) { // simulated callback from the player 
    while(data[i].ts < timestamp) { 
     data[i++].el.show(); 
    } 
}); 

I君は、私はおそらくそれ他の方法で回避するだろうどこ場合。サーバーからJSONデータを出力し、JavaScriptを使用してリスト要素を作成します。 "no js"フォールバックが本当に必要な場合を除き...

関連する問題