【问题标题】:SignalR $.connection is undefinedSignalR $.connection 未定义
【发布时间】:2012-06-27 06:47:45
【问题描述】:

我承认,我不知道自己在做什么。

我正在尝试学习如何使用 SignalR,并且几乎逐字逐句地在线跟踪各种示例,但无法粘贴未定义的 $.connection。我正在使用 MVC 4.0 并尝试使用 nuget 下载的 signalR js 文件或示例项目中的文件。这些是我的脚本参考。

@Scripts.Render("~/Scripts/jquery-1.7.2.min.js")
@Scripts.Render("~/Scripts/knockout-2.0.0.js")
@Scripts.Render("~/Scripts/jquery.signalR.js")
@Scripts.Render("~/signalr/hubs")

脚本似乎已加载 - 我什至在它们的开头放置了触发警报,但 $.connection 始终未定义。

在一个奇怪的事件中,我有一个不同的项目,我试图使用不同的 jQuery 库,它使用 $.并且该对象也始终未定义。

我只是在寻找任何可能的解释,说明我可能做错了什么。提前非常感谢。

【问题讨论】:

  • 如果没有丝毫代码痕迹,我们应该如何提供帮助?
  • 页面中是否包含两次 jQuery?
  • @davidfowl 的评论为我解决了这个问题。我的 jQuery 脚本包含在视图中,也包含在 Shared 文件夹中的布局视图中。

标签: javascript jquery asp.net-mvc signalr


【解决方案1】:

我今天遇到了同样的问题。

您的回答为我指明了正确的方向,因为我的脚本加载设置完全相同。

我将所有脚本标签按以下顺序放在页面顶部(头部)。

  • jQuery
  • 信号R
  • /signalr/hubs
  • my-script.js

当然,@Layout.cshtml 非常周到地在<body> 标记的底部添加了@Scripts.Render("~/bundles/jquery")

这是正在发生的事情。

在此配置中,当页面加载时,它会按照指定的顺序加载 head 标记中的所有脚本。

所以它加载 JQuery,然后是 SignalR,它设置 $.connection,然后是自动生成的集线器脚本,它设置 $.connection.hubName,然后是网站的自定义脚本。

此时您的自定义代码运行。但是您的代码有时会等待body.onloaddocument.onReady,然后再访问$.connection

到此事件触发时,布局模板在正文标记末尾为您添加的脚本包也会下载并执行。此捆绑包再次包含 jquery 库....它重置了 $ 上的所有 SignalR 设置,现在您的 $.connection 不再定义。

如何解决

简单的解决方法,确保不要两次加载 JQuery,一次在 SignalR 之前,一次在 SignalR 之后。我将所有脚本移到捆绑包之后加载,它解决了这个问题。此处的最佳做法是使用模板提供的“脚本”部分。

@section scripts{
    @*/* load your scripts here. You can exclude jQuery, 
      coz it's already in the template */ *@
}

所以这根本不是 SignalR 错误...

那是我生命中的两个小时……我再也回不来了……

希望这会有所帮助。

【讨论】:

  • 太棒了,谢谢。仍然不起作用,但它让我更接近(控制台中不再出现错误)!
  • 你这个摇滚男...!!它工作并节省了那些宝贵的“其他有相同问题的开发人员的 2 小时”:)
  • 我正在学习一门复数课程,该课程还将 jquery 脚本添加到每个视图中,但忘记了该布局已经包含它们。 {{doubleFACEPALM}}
  • 只有 2 小时?还不错。
  • 如果您使用的是 asp.net mvc,您还可以使用捆绑包来捆绑您的 SignalR 脚本,并将该捆绑包最后加载到您的布局文件中(或您调用捆绑包的任何位置) .
【解决方案2】:

我解决了这个问题。我知道我做了什么,但我不知道为什么它确实有效。

我在 _Layout.cshtml 视图顶部引用了主 jquery 库(版本 1.7.2),但没有引用任何其他 jquery 脚本。我注意到默认情况下在布局视图中它正在加载

@Scripts.Render("~/bundles/jquery") 

在视图的底部,并且脚本部分位于其下方。

@RenderSection("scripts", required:false)

如图所示,我进一步更改了我的脚本引用,并将上面问题中显示的脚本引用放入了

@section scripts
{    
   @Scripts.Render("~/Scripts/jquery.signalR-0.5.1.js")
   @Scripts.Render("~/Scripts/jquery.color.js")
   @Scripts.Render("~/signalr/hubs")
   @Scripts.Render("~/Scripts/blasht.signalr.js")
}

包装器在我看来,以便在加载捆绑包后包含它们。我假设我没有加载所有必要的 jquery,因为现在它可以工作了。

现在,如果我能弄清楚这如何适用于我的其他项目。

【讨论】:

    【解决方案3】:

    之所以起作用,是因为 javascript 文件的加载顺序。如果您在加载 jquery 之前尝试加载 jquery.signalR-0.5.1.js,那么您将面临 $.connection undefined 因为要注册 jquery 应该首先加载。在 _Layout.cshtml 模板中,脚本按顺序加载

    @Scripts.Render("~/bundles/jquery")
    
    @RenderSection("scripts", required: false)
    

    因此,在您的任何视图中,您都可以在脚本部分下加载信号器,这应该可以正常工作。

    【讨论】:

      【解决方案4】:

      我也有同样的问题。 对我来说,我在页面中包含 jquery 2 次,后来在布局中包含。 删除其中一个解决了问题。

      希望对你有帮助

      【讨论】:

        【解决方案5】:

        这发生在我身上,因为我在加载 jquery.signalR-1.1.4.js 脚本之前动态加载了 ~/signalr/hubs 脚本。

        动态加载时,没有出现错误,但是如果我将 ~/signalr/hubs 的输出粘贴到我的 chrome 开发工具中,我会收到一条错误消息 VM1047:18 Uncaught Error: SignalR: SignalR is not loaded. Please ensure jquery.signalR-x.js is referenced before ~/signalr/hubs. at <anonymous>:18:15 at <anonymous>:300:2

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-05
          • 1970-01-01
          • 1970-01-01
          • 2021-04-07
          • 1970-01-01
          • 2012-11-08
          • 2019-06-17
          相关资源
          最近更新 更多