我正在构建一个与服务器端外部SignalR HUB
通信的Chrome扩展程序。
如果我在弹出页面中编写JS代码,我已设法将两者配置为彼此通信,此方法的问题是如果未打开扩展,则无法获取更新(没有回应引发的事件。)
为了解决这个问题,我读到我应该在background.js
中编写我的事件处理程序,所以即使弹出的扩展程序没有显示 - 它仍然会响应事件。但是,我仍然需要支持我的扩展程序上的按钮单击才能触发事件 - 在读取更多信息之后,我无法访问后台文件中的DOM。
所以我的问题是如何解决这个问题?我怎样才能从客户端调用服务器SignalR HUB中的函数(或发出ajax请求)?当弹出窗口未打开时,也会收到服务器的响应。
通过回复我的意思是更新background.js
中的值和图标徽章中的值的简单+1,将会通知用户发生了某些事情。
我对Chrome扩展程序很新,所以我很感激帮助!
这是我目前的代码:
的manifest.json
{
"manifest_version": 2,
"name": "Getting started ex1ample",
"description": "This extension shows a Google Image search result for the current page",
"version": "1.0",
"background": {
"scripts": ["jquery-2.1.4.min.js", "jquery.signalR-2.2.0.min.js", "background.js"],
"persistent": false
},
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": [
"activeTab",
"http://localhost:61275/"
]
}
background.js
var singalR = {};
$(document).ready(function(){
singalR.connection = $.hubConnection('http://localhost:61275/signalr/hubs', {useDefaultPath: false});
singalR.connection.logging = true;
singalR.roomIndexHubProxy = singalR.connection.createHubProxy('roomIndexHub');
singalR.connection.start().done(function() {
// Wire up Send button to call RoomIndexHubProxy on the server.
console.log('Hub has started');
$("#btn-join").click(function(){
singalR.roomIndexHubProxy.invoke('test', 111);
});
});
singalR.connection.error(function (error) {
console.log('SignalR error: ' + error)
});
singalR.roomIndexHubProxy.on('test', function (val) {
chrome.browserAction.setBadgeText({ text: val } );
});
});
popup.html
<!doctype html>
<html>
<head>
<script src="popup.js"></script> //empty for now
</head>
<body>
<button id="btn-join">Join</button>
</body>
</html>
服务器端HUB
public class RoomIndexHub : Hub
{
static int val = 0;
public RoomIndexHub(){
}
public async Task test(int k)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<RoomIndexHub>();
val++;
await Task.Delay(4000);
hubContext.Clients.All.test(val.ToString());
}
}
答案 0 :(得分:0)
您是否尝试过设置背景页的生命周期?将持久性设置为true,这样后台隐藏的页面将一直“生存”,并能够监听传入的请求。
"background": {
"scripts": ["background.js"],
"persistent": true
},
这将为您提供持久的背景页面。
请检查:Chrome documentation for event pages
Reards 卡斯滕