2011-07-14 9 views
0

私は非常にシンプルなjQueryベースのチャットルーム(入門ワークショップで使用される)に取り組んでいます。 現在のチャットは、400pxの高さとオーバーフロー自動に設定されたdivに表示されます。jQuery .loadコールバック/スクロール/ CSSオーバーフロー

jQueryの「load」関数は、HTML形式のチャットをデータベースから取り出してdivに配置するために使用されます。

チャットdivが常に下にスクロールされることを保証する、非常に単純なコードがあります。このコードは、load関数で完了コールバック機能を使用して呼び出されるscrollToBottomという名前の関数にあります。

loadステートメントは、ページの準備ができたら1秒に1回呼び出されるgetChatという関数にあります。

$(function() 
{ 
    getChat(); 
    setInterval("getChat();", 1000); 
}); 


function getChat() 
{ 
    $("#chatDiv").load("chat_server.php?get_chats=true", scrollToBottom()); 
} 


function scrollToBottom() 
{ 
    var chatHeight = document.getElementById("chatDiv").scrollHeight; 
    $("#chatDiv").scrollTop(chatHeight); 
} 

問題:ここでは、コードの関連塊だ と呼ばれるgetChat初めて、divが一番下までスクロールしません。その後の呼び出し(setInterval経由)では、スクロールがうまく動作します。ここで

私は/がこれまで行っている知っていることだ:私はscrollHeightを警告するとき、それは「400」は初めてと「441」以降の回だった、しかし、

コールバックが最初に呼び出されている(つまり、 divのサイズより大きなコンテンツがある場合はどうなるべきか)。

441のハイコンテンツのscrollTop値が400の場合は、スクロールバーを下にスクロールする必要がありますが、scrollToBottomに400のハード値を設定しても問題は解決しません。 これは、問題がロードコールバックではなくCSS /スクロールに関連していると考えています。

チャットdivは空になりますが、nbspまたは1文字のを含むように変更すると、は問題を解決しませんでした。スクロールが必要なハードコーディングされたコンテンツでdivを開始させるDIDは問題を解決します。

この段階では、scrollTopが動作するためにはスクロールバーを表示/アクティブにする必要があるようですが、コールバックが発生する理由は初めてではありません

... ...コンテンツがロードされている(したがって、スクロールバーがアクティブ/見えるはず) AFTER

ちょうどそれが他人のコールバック関数が匿名インラインものであれば、まだ、それが正常に動作させるに

$(function() 
{ 
    getChat(); 
    setInterval("getChat();", 1000); 
}); 


function getChat() 
{ 
    $("#chatDiv").load("chat_server.php?get_chats=true", 
    function() 
    { 
     var chatHeight = document.getElementById("chatDiv").scrollHeight; 
     $("#chatDiv").scrollTop(chatHeight); 
    } 
    ); 
} 

このバージョンは、最初とその後のすべての時間で正常に動作します...

このような状況で誰かがどんな光を放つことができますか? ありがとう、 Greg

+0

- :

同様に
$("#chatDiv").load("chat_server.php?get_chats=true", scrollToBottom); 

を、あなたがたsetIntervalコールを簡素化することができ文法はちょっと醜いので、私はそれを避けたいと思いますし、私はできるだけクリーンで簡単にワークショップを続けたいと思います。私が別のエレガントなソリューションを見つけることができない場合、私はそれを使用します。 – Greg

+0

.load()パスの最初の例のように、scrollToBottom()がパラメータとして渡されます。 2番目のコードサンプルは、load()が成功してトリガーされた場合のハンドルです。 – Tyde

答えて

0

javascriptでは、関数anonymousかどうかはファーストクラスなので、引数として渡すことができます。匿名形式を使用する必要はなく、関数を初めて呼び出す必要はありません。ただ、負荷への引数としてscrollToBottomを渡す:私はちょうどインライン無名関数のバージョンを使用していない、なぜあなたは迷っている場合は

setInterval(getChat, 1000); 
+0

ああ、私は欠けていた単純なものがあることを知っていました!非常にありがとう、それはそれを修正しました。しかし、それをワークショップに組み込むかどうかという厳しい要求です... – Greg