TNT
TNT

Reputation: 870

JQuery 3 and SignalR 2.2.0

I use SignalR 2.2.0 in a MVC5 project. SignalR depends of JQuery in client-side.

JQuery recently released new version, I updated it from Nuget, specifically from version 2.2.4 to 3.0.0.1, but then SignalR stopped working. Startup command "$.connection.hub" in javascript fails. After a long time head scratching, I downgrade JQuery to 2.2.4 and everything is fine again.

Am I the only one getting this problem? There is any workaround?

Thanks.

Upvotes: 25

Views: 20821

Answers (3)

Simon_Weaver
Simon_Weaver

Reputation: 146198

If you're still getting errors like this after updating to 2.2.1 and jQuery 3.x then read on...

TypeError: Cannot read property 'client' of undefined

Like I am you are probably using the dynamically generated proxy, and you checked your /signalr/hubs file and found you don't have any proxies defined.

 var proxies = {};

Wait you may ask I didn't change anything - where did they go?

Well, like me you probably were in such a hurry to upgrade signalR to 2.2.1 that you forgot to do it in all your projects and now you are using both 2.2.1 and 2.2.0 in different assemblies. (I am defining my hubs in a different assembly than my main app).

All I needed to do was make sure I had the latest nuget package version in every project and it all worked. Should work fine after rebuilding. If not, this may also help.

Also do yourself a favor and read the jQuery 3 upgrade guide if you use much jQuery elsewhere.

Upvotes: 1

TNT
TNT

Reputation: 870

Finally version 2.2.1 of SignalR was released, solving this problem. Thanks for all comments.

Upvotes: 22

Quentin Roger
Quentin Roger

Reputation: 6538

You must edit the signalR code by yourself, In jquery 3 they removed the shortcut for load event :

Breaking change: .load(), .unload(), and .error() removed

These methods are shortcuts for event operations, but had several API limitations. The event .load() method conflicted with the ajax .load() method. The .error() method could not be used with window.onerror because of the way the DOM method is defined. If you need to attach events by these names, use the .on() method, e.g. change $("img").load(fn) to $(img).on("load", fn).

https://jquery.com/upgrade-guide/3.0/

so in the file jquery.signalR-{version}.js :

you must update this line :

_pageWindow.load(function () { _pageLoaded = true; });

To :

_pageWindow.on("load",function () { _pageLoaded = true; });

Upvotes: 21

Related Questions