1

jquery の専門家の皆さんがこれを手伝ってくれることを願っています。私はhtml/jqueryにチャットルームを持っています。新しいユーザーがチャットルームに来るたびに更新されるユーザーの動的リストを持つ DIV があります。いずれかのユーザーをクリックすると、プライベート チャット用の jquery ダイアログが表示されます。それはすべてうまくいきます。問題は、最初のプライベート チャット (jquery ダイアログ) を開いた後で、新しいユーザーがチャットルームに参加すると、チャットルーム ユーザーのリンクが機能しなくなることです。(ユーザーリストを更新しようとしても)。Mozilla の開発者コンソールで確認したところ、ダイアログを開くと、HTML ページの最後に DIV セクションが追加されていることがわかりました。そのとき、jquery によって生成された他のすべてのリンクが機能しなくなります。

問題の関数は次のとおりです (最初のプライベート チャット ダイアログが開かれるまで、任意の数のユーザーに対して正常に機能し、その後、リンクが機能しなくなります)。

<script type="text/javascript"> 


    function privateChatLoader() {

        $(document).ready(function() {

            $('#chatRoomUsers td a').each(function() {
                var chatRoomId = $.trim($('#chatRoomId').val());
                var fromUsername = $.trim($('#username').val());
                var privateMessageTop = '<tr><td align="left" valign="middle" class="popup-box-top"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td width="10">&nbsp;</td><td width="300" align="left" valign="middle"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td width="23" align="left" valign="middle"><img src="images/icon-popup.png" width="16" height="16" /></td><td align="left" valign="middle" class="popup-title-text ">_TO_USERNAME_</td></tr></table></td><td align="right" valign="middle"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="right" valign="middle">&nbsp;</td><td width="18" align="right" valign="middle"><a href="#" onClick="closePrivateMessage();" id="dialog2"><img src="images/button-close.png" width="15" height="14" border="0" /></a></td></tr></table></td><td width="10">&nbsp;</td></tr></table></td></tr>';
                var $dialog = $('<div></div>')
                var $link = $(this).on('click', function() {
                    var toUsername = $link.attr("id");
                    privateMessageTop = privateMessageTop.replace("_TO_USERNAME_", toUsername);
                    $dialog
                        .load('privatemessage.php?cid=' + chatRoomId + '&s=' + fromUsername + '&r=' + toUsername)
                        .dialog({
                            //autoOpen: false,
                            title: privateMessageTop,
                            close: toUsername,
                            width: 400,
                            height: 300
                        });

                    $link.click(function() {
                        $dialog.dialog('open');
                        return false;
                    });

                    return false;
                });
            });
    });
}

*更新: * 気にしないでください。私はそれを働かせました。問題は、ダイアログにロードしていたページで、すべての JavaScript ファイルと jquery ファイルを (メイン ページからのコピー アンド ペーストから) 再度ロードしていたことです。そのページからすべてを削除すると、すべてが意図したとおりに機能します。みんなありがとう

4

2 に答える 2

0

あなたの .dialog の使用は、私には適切ではないようです。

これを試して:

function privateChatLoader() {

    $(document).ready(function() {

        $('#chatRoomUsers td a').each(function() {
            var chatRoomId = $.trim($('#chatRoomId').val());
            var fromUsername = $.trim($('#username').val());
            var privateMessageTop = '<tr><td align="left" valign="middle" class="popup-box-top"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td width="10">&nbsp;</td><td width="300" align="left" valign="middle"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td width="23" align="left" valign="middle"><img src="images/icon-popup.png" width="16" height="16" /></td><td align="left" valign="middle" class="popup-title-text ">_TO_USERNAME_</td></tr></table></td><td align="right" valign="middle"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="right" valign="middle">&nbsp;</td><td width="18" align="right" valign="middle"><a href="#" onClick="closePrivateMessage();" id="dialog2"><img src="images/button-close.png" width="15" height="14" border="0" /></a></td></tr></table></td><td width="10">&nbsp;</td></tr></table></td></tr>';
            var $dialog = $('<div></div>')
            var toUsername = $(this).attr("id");
            privateMessageTop = privateMessageTop.replace("_TO_USERNAME_", toUsername);

            $dialog.load('privatemessage.php?cid=' + chatRoomId + '&s=' + fromUsername + '&r=' + toUsername)
                   .dialog({
                        autoOpen: false,
                        title: privateMessageTop,
                        close: toUsername,
                        width: 400,
                        height: 300
                    });

            $(this).click(function() {
                 $dialog.dialog('open');
                 return false;
            });
        });
    });
}

次に、使用していることを確認します

.dialog('close')

ダイアログ ボックスを閉じます。

詳細については、次のブログを参照してください: http://blog.nemikor.com/2009/04/08/basic-usage-of-the-jquery-ui-dialog/

于 2012-06-23T17:12:37.037 に答える
0

html を同じ要素に置き換えると、それらに直接バインドされていたイベントが失われることを理解することが重要です。同じことが、元のイベント ハンドラーが適用されたときにページになかった新しい要素を追加する場合にも当てはまります。

他のコードと UI の動作を確認せずに、コードのどの部分が問題であるかを正確に判断することは困難です。

ただし、コンテンツを ajax でロードしていることがわかります。したがって、イベントをデリゲートして、将来の要素にそれらのイベントが自動的にアタッチされるようにする方法を学ぶ必要があります。

jQuery 1.7 を使用している場合は、使用する必要がありon()ます。delegate()

詳細な説明: jQuery Docs FAQ - Ajax リクエスト後にイベントが機能しなくなる理由

メソッド API リンク:

http://api.jquery.com/on/

http://api.jquery.com/delegate/

于 2012-06-23T16:48:40.780 に答える