不确定在哪里放置 Scripts.Render for JQuery

Posted

技术标签:

【中文标题】不确定在哪里放置 Scripts.Render for JQuery【英文标题】:Not sure where to place Scripts.Render for JQuery 【发布时间】:2015-05-17 16:26:00 【问题描述】:

我在尝试调用 JQuery 中的自动完成函数时收到“Uncaught TypeError: undefined is not a function”,我假设我有我的脚本.在错误的地方渲染。 JQuery 脚本应该放在 layout.cshtml 中的什么位置?我的假设是最重要的,但无论我把它们放在哪里,我似乎都无法让它发挥作用。

这是我的布局文件的顶部:

<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - My ASP.NET Application</title>
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jqueryui")
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
    @Styles.Render("~/Content/themes/base/css")
</head>...

在底部我有这个:

...
    @Scripts.Render("~/bundles/modernizr")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>

在我的视图文件的底部,我有 javascript

@section scripts
    <script>
    $(document).ready(function () 

        $('#mpvalue').autocomplete(
            source: '@Url.Action("MyMethod")'
        );

    );
    </script>

我还在 BundleConfig 中进行了一些捆绑:

    bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                "~/Scripts/jquery-version.js"));

    bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                "~/Scripts/jquery.validate*"));

    bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
                  "~/Content/themes/base/jquery.ui.core.css",
                  "~/Content/themes/base/jquery.ui.resizable.css",
                  "~/Content/themes/base/jquery.ui.selectable.css",
                  "~/Content/themes/base/jquery.ui.accordion.css",
                  "~/Content/themes/base/jquery.ui.autocomplete.css",
                  "~/Content/themes/base/jquery.ui.button.css",
                  "~/Content/themes/base/jquery.ui.dialog.css",
                  "~/Content/themes/base/jquery.ui.slider.css",
                  "~/Content/themes/base/jquery.ui.tabs.css",
                  "~/Content/themes/base/jquery.ui.datepicker.css",
                  "~/Content/themes/base/jquery.ui.progressbar.css",
                  "~/Content/themes/base/jquery.ui.theme.css"));
    // Use the development version of Modernizr to develop with and learn from. Then, when you're
    // ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
    bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                "~/Scripts/modernizr-*"));

    bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
              "~/Scripts/bootstrap.js",
              "~/Scripts/respond.js"));

    bundles.Add(new StyleBundle("~/Content/css").Include(
              "~/Content/bootstrap.css",
              "~/Content/site.css"));

根据我在网络上的其他帖子和示例中阅读的内容,一切似乎都在正确的位置。

我在做什么来抛出“Uncaught TypeError: undefined is not a function”?

任何帮助将不胜感激

谢谢!

编辑:这是在 ASP.NET MVC 5 上运行的

【问题讨论】:

您已经重复了两次Scripts.Render("~/bundles/modernizr")(可能还重复了其他人?)保持一致并将@Scripts.Render() 呈现在一个位置(最好在底部,但有支持和反对将脚本放在头部的论点) )。确保它们的顺序正确且没有重复。 能否提供相关生成的 HTML 标签(在浏览器中查看源代码)? 【参考方案1】:

您的包含顺序实际上与您的 JS 错误没有任何关系。它看起来不像 jQueryUI JavaScript 文件实际上包含在您的任何脚本包中。你有一堆 jQueryUI 的 CSS 文件,但没有 JS 文件。在问题中包含的代码中,您尝试呈现一个名为“jqueryui”的包,但在 BundleConfig 中没有使用该名称定义的包。

假设您已将 jQueryUI 添加到项目中,jQueryUI 脚本包应如下所示(取自 MVC4 模板):

bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include(
            "~/Scripts/jquery-ui-version.js"));

【讨论】:

我为您的答案编辑了相关捆绑包的示例。如果您愿意,可以随意回滚。【参考方案2】:

根据经验,您将所有@Styles.Render(...) 定义在您的头顶,并将所有@Scripts.Render(...) 定义在您的身体之前。

它们肯定会在其他地方工作,但是你会遇到不同类型的性能问题,或者只是像现在这样简单的重复声明。

在这种情况下,您确实有一个重复的 modernizr 声明。

如果此答案不能解决您的问题,请提供相关生成的 HTML(页面底部的 &lt;script&gt;/&lt;style&gt; 标签)以及控制台输出(它会告诉您从这个错误来自哪个脚本)。

【讨论】:

以上是关于不确定在哪里放置 Scripts.Render for JQuery的主要内容,如果未能解决你的问题,请参考以下文章

我正在使用 Firebase Apple 登录进行用户登录,但我不确定在哪里放置 https://myapp.firebaseapp.com/__/auth/handler?

在哪里放置启动图像?

在哪里放置我的 base.html 文件?

我想用 Scripts.Render 使用 defer 并用 Styles.Render 预加载

Android kivy 在哪里放置应用程序文件(ini、图像数据库等)

Jquery UI - 自动完成不是一个功能