部分视图和 jQuery

Partial Views and jQuery

我有这样一个布局页面(简化代码)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>@Resources.LayoutPageTitle | @ViewBag.Title</title>

    [...other code omitted...]

</head>

<body id="page-top">
    @Html.Partial( "_LandingNavbar" )

    [...other code omitted...]

    <!-- Placed at the end of the document so the pages load faster -->
    <!-- jQuery -->
    <script src="~/assets/js/jquery/jquery-2.1.3.min.js"></script>

    @RenderSection( "scripts", required: false )

</body>
</html>

如您所见,我在加载 jQuery 脚本之前加载了局部视图。在我的部分视图中,代码如下

<div class="dropdown profile-element">
    <span class="text-center" id="userInfo"></span>
</div>
<script type="text/javascript">
    $(document).ready(function () {
        $.ajax({
            type: "POST",
            url: '/GetUserInfo',
            data: {},
            dataType: 'json',
            success: function (data) {
                alert(data);
            }
        });
    });
</script>

但我得到

ReferenceError: $ is not defined
https://localhost:44301/ Line 237

据推测,当 jQuery 脚本执行时,jQuery 仍未加载。但是 $(document).ready(function () 指令不应该保证这一点吗?

这是试图将函数连接到 $(document).ready 事件导致错误的行为。即使您不打算在页面加载之前执行该函数,jQuery 构造函数在 jQuery import

之前仍然是 运行
$(document).ready(function(){}) // use jquery to find the document object, then wire up this function to the ready event
<script src="~/assets/js/jquery/jquery-2.1.3.min.js"></script> // go ahead and import jquery

$(document).ready() 仅在加载 JQ 时有效,因为它本身是一个 Jquery 函数。

如果您改用 DOMContentLoaded 事件会怎样?

document.addEventListener('DOMContentLoaded', function() { 
                          // Your code 
});

实际上您在 jquery 之前加载局部视图。所以首先它会尝试执行 $(document) 然后你会得到 $ is not defined。试试这个

<head>
//[...other code omitted...]
    <!-- jQuery -->
    <script src="~/assets/js/jquery/jquery-2.1.3.min.js"></script>
</head>

<body id="page-top">
    @Html.Partial( "_LandingNavbar" )

    [...other code omitted...]

    <!-- Placed at the end of the document so the pages load faster -->

    @RenderSection( "scripts", required: false )

</body>