当一页有两个选项卡时,通知不起作用

时间:2019-05-11 07:46:56

标签: asp.net-mvc notifications signalr

我正在MVC Web应用程序上使用通知以及SignalR。我正在从服务器的某个页面调用客户端功能。问题在于,同时在两个浏览器选项卡中打开该页面时,不会弹出任何通知。我应该提到的是,仅在一个选项卡中打开页面时,它确实可以正常工作。

我注意到,如果我在创建通知对象的行之前放置一个警报,则两个选项卡都会收到通知,这就是我所期望的。预先感谢。

$(function () {
    var notificationHub = $.connection.notificationHub;
    $.connection.hub.start();
    notificationHub.client.sendMessage = function (content) {
        setTimeout(notifyMe(content), 10);
    };
});

function notifyMe(message) {
    if (!("Notification" in window)) {
        alert("This browser does not support system notifications");
    }
    else if (Notification.permission === "granted") {
        var notification = new Notification(message);            
    }
    else if (Notification.permission !== 'denied') {
        Notification.requestPermission(function (permission) {
            // If the user accepts, let's create a notification
            if (permission === "granted") {
                var notification = new Notification(message);
            }
        });
    }
}

更新: 在这种情况下,通知创建代码之前带有一个警报,该警报可使警报按预期方式工作:

    function notifyMe(message, system) {
        if (!("Notification" in window)) {
            alert("This browser does not support system notifications");
        }
        else if (Notification.permission === "granted") {
            alert('hit');
            var notification = new Notification(system, {
                body: message,
                tag: (Math.floor(Math.random() * 10)).toString(),
                icon: 'Content/Images/logo.png',
                dir: 'rtl',
                background: '#ff0000'
            });

        }
        else if (Notification.permission !== 'denied') {
            alert('hit');
            Notification.requestPermission(function (permission) {
                if (permission === "granted") {
                    var notification = new Notification(message)
                }
            });
        }
    }

$(function () {
    var notificationHub = $.connection.notificationHub;
    $.connection.hub.start();
    notificationHub.client.sendMessage = function (content, system) {
        setTimeout(notifyMe(content, system), 10);
    };
});

1 个答案:

答案 0 :(得分:0)

问题可能出在您的信号器初始化代码中。 我假设var notificationHub是globla对象,并且您已将此母鹿放在母版页中。

然后,您需要检查notificationHub是否为空,然后再对其进行初始化。只需像这样更改代码:

$(function () {
    if(notificationHub === undefined || notificationHub === null){
       var notificationHub = $.connection.notificationHub;
       $.connection.hub.start();
       notificationHub.client.sendMessage = function (content) {
           setTimeout(notifyMe(content), 10);
       };
    }
});

更新

当您确认Signalr正常工作(即警报消息在两个选项卡中均工作)后,请对Notification对象尝试以下操作:

var notification = new Notification('Test', {
    body : message,
    tag : 'notify-tag-name', //Make this a random number
    icon : 'icon.png'
});

请注意,如果两个浏览器标签中的 tag 属性值相同,则即使打开了许多浏览器标签,通知也只会显示一次。在这种情况下,您只能在标签名称中使用随机数,以确保标签之间的标签不同。