0

新しいメッセージをチェックするjQuery AJAX関数があり、ある場合は、新しいメッセージがあることをユーザーに通知します。私の機能はgetNewMessage();、すべてが一度に発生するため、ページの更新時に完全に機能するものです。ただし、に入れると、setInterval("getNewMessage()", 20000)通知の無限ループが発生します。これは理解できますが、毎回ユーザーに通知するのを止めて、同時に新しいメッセージをチェックし続けるにはどうすればよいですか?

これは私の getMessage 関数です。大きな関数で申し訳ありません:

function getNewMessage()
{
    /** Retrieve new messages **/
    $.post('',  { newMessage : true}, function(data)
    {      
        data = $.parseJSON(data);

        /** If new messages exist then display  notification and popup **/
        if(data)
        {

            var newMessageDialog = $('#newMessageDialog');

            /** Create popup dialog options **/
            newMessageDialog.dialog(
            {
                autoOpen: false,
                modal: true,
                minWidth: '100',
                width: '800',
                hide: 'fold',
                show: 'drop',
                title: "New Messages",   
                close: function()
                {
                    hideAllNotifications();
                } 
            });

            /** Initialise variables **/
            var html = '';
            var length = 0;
            var total = 0;

            /** For each message we create the html for the message and insert into dialog **/
            $.each(data, function(name, messages)
            {
                length = messages.length;
                total += length;
                /** For grammatical reasons. If length > 1 then "message" is plural**/
                grammar = (length > 1) ? "messages" : "message";

                /** Reverse the messages so the latest message appears at top and earliest message at bottom **/
                messages.reverse();

                var msgs = '';
                for(var i in messages)
                {
                    msgs += '<p>' + messages[i]['date'] + ': ' + messages[i]['message'] + '</p>';
                }

                html += '<a href="uid[' + messages[i]['uid'] + ']" class="popUpLink">' + name + ': ' + length + ' new ' + grammar + '</a>';
                html += '<div class="popUpDialog" id="viewNewMessageDialog" title="New messages from ' + name + '"><div class="flexi_box"><h3 class="hubHeader">' + name + '</h3>' + msgs + '</div></div>';
                html += '</br>';
            });

            /** Insert Content **/
            $('.flexi_box h3', newMessageDialog).after(html);

            /** Bind dialog to popuplinks **/
            popUpDialogs();

            /** Bind click event
             *  If clicked then we assume message has been read so we delete from messages table **/
            $('a.popUpLink', newMessageDialog).on('click', function()
            {
                /** Get userid from href **/
                var uid = $(this).attr('href');
                var start = uid.indexOf('[');
                var end = uid.indexOf(']');
                uid = uid.slice(start + 1, end);
                removeReadMessages(uid);
            });

            var grammar2 = (total > 1) ? 'messages': 'message'
            var notifier = showNotification('info', '<h3>You have ' + total + ' new ' + grammar2 + '. Click here to view new ' + grammar2 + '</h3>');

            /** Open dialog on click **/
            $('.info').on('click', function()
            {               
                /** Trigger Dialog **/
                $('#newMessageDialog').dialog('open').css('maxHeight', $(window).height()-90);
            });

            return true;
        }
    });//end post   
}
4

3 に答える 3

3

を呼び出す代わりに、 を呼び出して関数を 1 回setInterval実行する必要があります。 次に、AJAX コールバックで、メッセージを受け取らなかった場合は、もう一度呼び出します。setTimeout
setTimeout

于 2012-05-15T12:09:44.850 に答える
0

前のメッセージとは異なる新しいメッセージを受信したかどうかを検出します。新しいメッセージがある場合のみ、ダイアログを表示します。

于 2012-05-15T12:09:58.773 に答える
0

グローバル変数 (配列) を作成し、通知を表示するたびにその中に格納messages[i]['uid']します。次に、もう一度確認するときに、配列に既にあるものを除外します。

于 2012-05-15T12:10:27.170 に答える