【问题标题】:JavaScript runtime error: "$" is undefined - ASP.NET WebForms (MasterPage)JavaScript 运行时错误:“$”未定义 - ASP.NET WebForms (MasterPage)
【发布时间】:2016-03-17 01:50:21
【问题描述】:

我希望有人可以帮助我,因为我无法为我的问题找到可行的解决方案。

我正在使用 C# 在 ASP.NET WebForms 中进行编码。我使用 MasterPage。 在这个 MasterPage 中,我在 ScriptManager 中定义我的脚本。

<asp:ScriptManager ID="smScripts" runat="server">
    <Scripts>
        <asp:ScriptReference Path="~/Scripts/jquery-2.1.1.min.js" />
        <asp:ScriptReference Path="~/Scripts/bootstrap.min.js" />
        <asp:ScriptReference Path="~/Scripts/printArea.js" />
        <asp:ScriptReference Path="~/Scripts/globalFunctions.js" />
        <asp:ScriptReference Path="~/Scripts/jquery.browser.min.js" />
        <asp:ScriptReference Path="~/Scripts/jquery.reject.js" />
    </Scripts>
</asp:ScriptManager>

现在,如果我在任何页面中使用 jQuery e。 G。 Default.aspx 里面的函数可以正常工作:

<script type="text/javascript">
    function Print(options) {
        $("div.PrintArea").printArea(options);
    }
</script>

但是如果我尝试直接在脚本块中使用它——例如等到文档准备好——它就不起作用:

<script type="text/javascript">
    $(document).ready(function () {
        // some code
    });
</script>

我收到错误“JavaScript 运行时错误:“$”未定义”。 我不知道如何解决这个问题。

也许有人可以帮助我?提前致谢。

【问题讨论】:

  • 可能,您的&lt;script&gt; 标签位于之前 jQuery 参考。当你调用一个函数时,jQuery 已经加载并且可以正常工作了。但是当您尝试执行 $(document).ready 时,它没有加载并引发此错误。我有 95% 的把握。打开生成的 HTML 看看是不是。 jQuery 应该在$(document).ready 或任何其他用法之前引用。
  • 感谢您的评论。你可能是对的,但是我如何确保在调用任何其他代码之前(在我的 MasterPage 中)始终加载 jQuery?
  • 有时,这也发生在我身上。始终是因为使用了 3rd 方 JS,它们之间相互影响。尝试注释所有的 JS,然后一点一点地取消注释。

标签: javascript jquery asp.net webforms master-pages


【解决方案1】:

只要确定

 <asp:ScriptReference Path="~/Scripts/jquery-2.1.1.min.js" />

在您调用之前写入/加载

$(document).ready(function ()

您的代码“function Print(options)”工作正常,因为 jquery 库在页面准备好时未加载,但在一段时间后加载。您的 Print 函数在调用时需要 jquery 而不是页面就绪事件。

【讨论】:

    【解决方案2】:

    假设我们想在每个页面中添加 jquery,因此您需要在母版页中包含对脚本的引用。

    根据最佳实践,您应该将所有 javascript 引用和脚本放在 &lt;body&gt; html 标记的末尾:就在 &lt;/body&gt; 标记之前。

    因此,在您的情况下,您应该在 &lt;body&gt; 标记的末尾引用所有常见的 js 文件,然后设置这样的部分:

    <asp:ContentPlaceHolder id="myJsWhatever" runat="server">
    
    </asp:ContentPlaceHolder>
    

    因此,在从母版页继承的页面中,您在本节中定义了所有 JS,并确保首先加载 jquery。

    如果您不想更改所有内容,只需在 html 页面的 head 部分添加 jquery 引用即可。

    【讨论】:

    • 问题是,ScriptManager 在母版页的正文部分。我的头部的 ContentPalceHolder 在头部。所以我认为在内容页面中,在加载母版页正文中的 ScriptManager 之前加载头部。
    • @CSharper,你需要添加一个像&lt;script src="~/Scripts/jquery-2.1.1.min.js"&gt;&lt;/script&gt;这样的直接js引用,不要使用ScriptManager进行这种引用
    • 现在我这样做了。这有效。但是使用“~/Scripts/...”,内容页面无法加载脚本。所以我直接从我的服务器加载脚本,如下所示:src="https://..."。也许有更好的方法?也看看我的回答。
    【解决方案3】:

    如果我使用简单的脚本标签 之前 ContentPlaceHolder 而不是 ScriptManager 它可以工作:

    <head>
        <script src="https://.../jquery-2.1.1.min.js" type="text/javascript"></script>
    
        <asp:ContentPlaceHolder ID="phHead" runat="server">
        </asp:ContentPlaceHolder>
    </head>
    

    为了确保每个内容页面上的路径都是正确的,我直接从我的服务器加载它,而不是使用像“~/scripts/...”这样的路径。也许有更好的方法?

    【讨论】:

    • 添加这样的脚本:&lt;script runat="server" type="text/javascript" src='&lt;%= Page.ResolveUrl("~/Scripts/jquery-2.1.1.min.js") %&gt;'&gt;&lt;/script&gt;
    • 如果我使用带有 runat 属性的脚本标签,它不会编译。如果我在没有 runat 属性的情况下使用它,它符合但我收到以下错误:德语原件:Die Steuerelementeauflistung kann nicht geändert werden, da das Steuerelement Codeblöcke enthält (z.B. )。谷歌英语:无法修改控件列表,因为控件包含代码块(即 )。
    • @Thomas,也许你能再帮我一次?
    • @Thomas:不幸的是,我无法使用文件系统路径加载我的脚本。我必须从“https://.../Scripts/jQuery.js”之类的网络路径加载它们才能使其工作。我该如何改变这个?
    • 抱歉,您可以更新您的问题或添加一个新问题吗?它可能对其他人有用,我需要有关您遇到的问题、异常等的更多信息……在此先感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2013-07-12
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多