Javascript jQueryUIAccordion在MVC4调试模式下工作,但不在发行版中

Javascript jQueryUIAccordion在MVC4调试模式下工作,但不在发行版中,javascript,jquery,jquery-ui,asp.net-mvc-4,accordion,Javascript,Jquery,Jquery Ui,Asp.net Mvc 4,Accordion,我在一个ASP.NETMVC4应用程序上工作 我更新了项目中的jQuery、jQuery UI和所有其他nuget包。构建并运行它以确保没有问题发生。一切正常,所以我继续开发了几天 过了一段时间,我将这个项目发布到一个测试服务器上,我必须看看它在Ipad、Iphone等设备上的外观,然后我意识到jQueryUI手风琴停止了工作 它渲染,但单击时不响应。这适用于所有浏览器。我发现这很奇怪,因为唯一的区别是我在发布模式下应用的MVC绑定,据我所知,它要么缩小了jQuery文件,要么选择了缩小的版本(

我在一个ASP.NETMVC4应用程序上工作

我更新了项目中的jQuery、jQuery UI和所有其他nuget包。构建并运行它以确保没有问题发生。一切正常,所以我继续开发了几天

过了一段时间,我将这个项目发布到一个测试服务器上,我必须看看它在Ipad、Iphone等设备上的外观,然后我意识到jQueryUI手风琴停止了工作

它渲染,但单击时不响应。这适用于所有浏览器。我发现这很奇怪,因为唯一的区别是我在发布模式下应用的MVC绑定,据我所知,它要么缩小了jQuery文件,要么选择了缩小的版本(后者可能就是这里的功能,因为它是在使用nuget更新时添加的)

jQuery版本是:2.0.3

jQueryUI版本为:1.10.3

在Chrome控制台中,错误显示为:

未捕获的TypeError:无法读取未定义的属性“safari”

好的,我意识到这可能是我的一个jQuery程序集引用$.browser的结果,它显然在jQuery 1.9中被删除了

然而,它在调试模式下工作(使用非小型版本)的事实让我认为它可能不是这样。我几乎可以认为这是缩小版本的问题,但这也不可能

有人知道为什么会发生这种情况,知道如何解决吗

更新 根据要求,我附上大部分代码。奇怪的是,它在调试模式下工作,但在发行版中却不工作。我不明白为什么会有任何重大变化会导致这个问题:

_Layout.cshtml

捆绑图

视图(称为局部视图)

局部视图

jquery代码

Chrome中的javascript错误

chrome中错误的更大视图

只是补充一下。在发布这篇文章后,我删除了modernizr的重复加载(telerik定制版在我没有注意到的情况下添加)。这个问题仍然存在

更新2 我关闭了bundleconfig中的优化

BundleTable.EnableOptimizations = false;
这使我能够看到是什么在jQueryUI中抛出了错误,而且似乎确实是删除了$.browser。看起来它实际上加载了jquery的两个旧版本(当前+1.6.4和1.7.1)以及jquery ui的一个和两个新版本(当前+1.8.16),最后一个版本抛出了一个错误。这些文件均未加载到我的解决方案或文件夹中


这似乎是一个发布问题,但被捆绑和缩小所掩盖。。。我将尝试修复此问题,看看它是否有效。

我认为您忘记添加“~/Content/themes/base/jquery ui.all.css” 注意:虽然您单独调用了所有模块,但有时调用单个文件会有所不同。因为我们在选择单独的模块时可能会遗漏一些依赖文件

在BundleConfig.cs中,您需要添加/修改以下内容:

bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
"~/Content/themes/base/jquery-ui.css",
"~/Content/themes/base/jquery-ui.all.css"
));
如果在本地存在jQueryUI文件,那么它也会起到同样的作用(这可能是导致它在本地测试中工作的问题)

您的_layout.cs将像

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryui")
@Styles.Render("~/Content/themes/base/css")
@RenderSection("scripts", required: false)
因为您没有呈现jqueryUI,所以我们需要在jQuery之后调用和呈现jqueryUI

你的部分脚本应该这样调用

@section Scripts{
@*@Scripts.Render("~/bundles/jqueryUI")*@
<script type="text/javascript">
$(document).ready(function () {
$("#accordian").accordian();
});
@节脚本{
@*@Scripts.Render(“~/bundles/jqueryUI”)*@
$(文档).ready(函数(){
美元(“#手风琴”)。手风琴();
});
}

这就是我的建议,并且应该有效,对于MVC来说,要确定确切的问题,事情非常小,所以我提供了所有这些行,谢谢


如果问题仍然存在,请发回。

好的,所以这根本不是代码本身的问题,我学到了一些可能对其他人有帮助的新东西

背景

BundleTable.EnableOptimizations = false;
是什么帮助我解决了这个问题

显然,Asp.NETMVC4捆绑包捆绑了在发布它的文件夹中找到的每个脚本,而不是VisualStudio中解决方案文件夹中的脚本。我根本没有想到这一点。。。但回想起来,这是有道理的

再加上VS默认发布设置不会删除与您发布的文件不相等的文件,这意味着在删除旧版本的Jquery并添加新版本时,旧版本仍然保留在服务器上

为jquery选择添加使用{version}的默认绑定,会出现一个无法读取的jquery文件抛出错误。直到您禁用绑定和缩小,我才发现在这种情况下加载了3个版本的Jquery:

以前

之后

解决方案是什么?简单,只需在发布向导中展开名为“文件发布选项”的设置,然后选中“删除其他文件…”:


谢谢你的建议。它帮助我找到了正确的位置,但我无法想象这就是问题所在。

请发布一些代码以便更好地理解,因为Microsoft有一些不同的jQuery代码可以解决问题。谢谢,没有任何代码等都很难。但是,您可以尝试的一件重要事情是将jQuery迁移添加到您的项目中。这将恢复所有不推荐使用的功能,您仍然可以使用jQuery>=1.9并使手风琴正常工作。@MarmiK请参阅更新的帖子。@Tobias是的,我已经读过了,但我仍然无法理解这个问题。总有一天我可能要解决这个问题。这并不能解释为什么只有在发布模式下才会发生这种情况。我可以给你一个指向网站本身的链接,但我不想在这里发布。@cfs如果你没有使用jquery unobtrusive and validate,那么你现在可以尝试对它们进行评论。另外,您可以使用浏览器中的任何web开发工具来比较调试和发布中实际包含的js文件,以比较它们。这会有帮助,因为也许你是missi