ajaxPoll チャット システムに問題があります。チャット メッセージの最後の ID を に返信しようとしてdiv
いますphp
。そのため、クエリは最後に送信された ID よりも大きい結果のみを表示できます。
すべてのチャット メッセージは、div
呼び出されchat_log
た . メッセージにはdiv
、メッセージの ID のクラスを含む があります。テキストのmessage
後にそのメッセージの ID が続きます (例: class="message543"
. 分かりやすくするために、構造と正しい順序で HTML のサンプルを示します。
<div id='chat_log'>
<div class='message435'></div>
<div class='message436'></div>
<div class='message437'></div>
<div class='message438'></div>
<div class='message439'></div>
<div class='message440'></div>
<div class='message441'></div>
</div>
ご覧のとおり、div max には 7 つのメッセージがあります。それよりも高いメッセージはすべて消去されます (問題なく動作する場合はすべて、ほんの少しの追加情報です)。もう 1 つの注意点として、jqueryライブラリと jquery プラグインを使用しています ここ、このブログ投稿の功績による. (プラグインの機能に関する情報は、そこにあります。)
私が試したこと:
function ajaxGo() {
$.ajaxPollSettings.pollingType = "interval";
$.ajaxPollSettings.interval = 700;
$.ajaxPollSettings.maxInterval = 1000;
$.ajaxPollSettings.durationUntilMaxInterval = 2000;
var httpcount = 1;
var lastDiv = lastDiv = $('#chat_log').find('div:last-child');
var lastId = lastDiv[0].className.substring(7);
$.ajaxPoll({
url: "place_chat/update.php",
type: "POST",
data: {
where: where,
'last': lastId
},
dataType: "html",
cache: false,
successCondition: function (result) {
var responseString = result;
if (result != '') {
$(result).appendTo('#chat_log').show();
lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
console.log(lastId);
httpcount = httpcount + 1;
if (!hasFocus && !titleCurrentlyChanging) {
changeTitle();
}
soundHandle = document.getElementById('soundHandle');
soundHandle.src = '../Sounds/Message.wav';
soundHandle.play();
}
}
});
}
$(document).ready(function () {
$('#chat_log').append('<div class="message0">Test</div>');
setTimeout(ajaxGo, 500);
});
このコードは文字列 'message' を取り除き、番号を取得します。コード:
lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
console.log(lastId);
...コンソールに貼り付けたときに正しく機能し、正しい最後div
のメッセージを出力しますid
。
ただし、非手動で実行された場合はそうではありません (おそらく、関数やループなどではないため)、コードは何らかの理由で、 +の0
メッセージが他にある場合にのみ ' ' を送信します。など、他にも多くのことを試しました。問題を引き起こしている可能性があると思われることの1つは、変数のスコープです。ポーリングの成功が呼び出されたときに、変数が調整されないようです。ただし、これが事実であるかどうかは完全にはわかりません。その場合は、コードが正しく機能するように変数のスコープを修正する方法をサポートしていただければ幸いです。id
1000
setInterval
function
lastId
余談ですが、php は正常に動作しているため、サポートは必要ありません。
重要な編集 (問題を理解しやすくする):コード
lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
...問題なく動作します。問題のように見えるのは、その周辺 (構造) です。また、スクリプトが送信された場所をphpに伝えるだけで、where
これには関係ありません。where
最初に呼び出された に追加された div があることを認識しています。これは、最初のを としてtest
定義することです。ループは最新の の取得を処理する必要がありますが、そうではありません。lastId
0
lastId
私が発見したこと:
lastId
ajaxPoll で編集されていません。div から正しい lastId を取得しますが、編集しませんlastId
。これにより、スコープの問題であることがほぼ明確になります