【问题标题】:jGrowl and Close Callback to request Ajax?jGrowl 并关闭回调以请求 Ajax?
【发布时间】:2013-02-13 01:46:53
【问题描述】:

我有一个 jQuery / jGrowl 问题,关于如何维护所呈现的 jGrowl 的状态。我有一个使用 PHP/MySQL 构建的通知系统。那是容易的部分。我已经设法让 jGrowls 正确显示。

现在,我想保持消息/jGrowls 的状态,直到用户单击每个 jGrowl 的“关闭”或关闭所有 jGrowl 的“全部关闭”链接。我有一个 users_notifications MySQL 表,我可以在其中管理哪些通知已被“读取”。我认为最好的方法是使用 close() 或 beforeClose() 回调将 getJSON (ajax) 请求发回服务器,但我不确定如何编写。我需要通过请求将通知 ID 传回。

<?php
if (!empty($notifications))
{
    foreach ($notifications as $notification)
    {
?>
        <script>
            <!--
            $(document).ready(function() {
                var notification = <?php echo json_encode($notification); ?>;
                $.jGrowl(notification.message, {
                    beforeClose: function(){
                        var markReadUrl = '<?php echo site_url('notifications/ajax_mark_as_read') ?>' + '/' + notification.id;
                        $.getJSON(markReadUrl, function(data) {
                            console.log(data);
                        });
                    }
                });
            });
            //-->               
        </script>
<?php
    }
}
?>

02/12 更新:我想我发现了让我困惑的地方。

在测试时,我使用了 2 或 3 个通知 (jGrowls)。我期待当用户单击单个 jGrowl 关闭链接(即 jGrowl 右侧的“x”链接)时会触发 beforeClose() 回调函数。 'x' 关闭是否有回调?请注意,当用户单击“全部关闭”时,beforeClose() 回调会正确触发,并触发每个 jGrowl 的函数。所以,在某种程度上,“关闭所有”就像一个“标记为已读”链接,而“x”链接什么也不做。这是预期的功能吗?

【问题讨论】:

    标签: php jquery ajax getjson jgrowl


    【解决方案1】:

    你是对的,你可以选择两个不同的回调,你可以使用'close'或'beforeClose'。我可能会选择“beforeClose”,因为此时通知已被解除,接下来将开始从页面中删除它的过程。

    因此,利用回调可能如下所示:

    $.jGrowl('Message here...', {
        beforeClose: function(){
            $.ajax({
                url: '/path/to/dismiss/action',
                success: function(){}
            });
        }
    });
    

    如果这是您将在每个通知中使用的内容,您可以执行以下操作...

    $.jGrowl.defaults.beforeClose = function(){
        //...
    }
    

    我的猜测是,您将需要以某种方式单独跟踪通知,这样当您发出 ajax 请求以将其关闭时,您将传回主键或类似的东西。我建议的一件事是使用 beforeOpen 回调并使用 data() 方法为您的主键设置唯一标识符。这样,当您设置消息时它就被绑定了,您可以稍后在它被关闭时引用它,而不必担心在其他地方处理信息。

    希望这会有所帮助!

    【讨论】:

    • 感谢您回复此 Stan。我真的没想到作者或jGrowl会回应。关于 beforeClose(),我在上面添加了一些额外的 cmets(更新 02/12)。我似乎无法关闭“x”来触发 beforeClose() 回调函数。 “关闭所有”似乎确实触发了 beforeClose()。
    • 进一步测试:如果我改为使用 close() 回调,然后单击“x”或“全部关闭”将触发 close() 回调函数。使用 closeBefore(),我只看到它在“全部关闭”时触发。
    • 哎呀!单独关闭未触发 beforeClose() 实际上是一个错误。我已经在github上提交了,今晚会修复它。仅供参考:github.com/stanlemon/jGrowl/issues/4
    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多