我正在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);
};
});
答案 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 属性值相同,则即使打开了许多浏览器标签,通知也只会显示一次。在这种情况下,您只能在标签名称中使用随机数,以确保标签之间的标签不同。