我有一个简单的jquery点击事件
<script type="text/javascript">
$(function() {
$('#post').click(function() {
alert("test");
});
});
</script>
以及在site.master中定义的jquery引用
<script src="<%=ResolveUrl("~/Scripts/jquery-1.3.2.js")%>" type="text/javascript"></script>
我已经检查了脚本被正确解析,我能够看到标记,并直接在firebug中查看脚本,所以我必须被发现。然而,我仍然得到:
$没有定义
jquery没有一个是有效的。我还尝试了它的各种变体,比如$(document)。ready和jQuery等。
这是一个。net 3.5上的MVC 2应用程序,我确信我真的很密集,谷歌上的所有地方都说要检查文件是否被正确引用,我已经检查了一遍又一遍,请建议!: /
这种错误只能由以下三种情况之一引起:
您的JavaScript文件没有正确地加载到页面中
你有一个拙劣的jQuery版本。这可能是因为有人编辑了核心文件,或者插件覆盖了$变量。
在页面完全加载之前就已经运行了JavaScript,因此,在jQuery完全加载之前就已经运行了JavaScript。
首先,确保正确调用了什么脚本,它应该是这样的
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
并且不应该有async或defer属性。
然后,您应该检查Firebug net面板,看看文件是否正在正确加载。如果没有,它将被突出显示为红色,并在旁边显示“404”。如果文件加载正常,则意味着问题是2。
确保所有jQuery javascript代码都在代码块中运行,例如:
$(document).ready(function () {
//your code here
});
这将确保在jQuery初始化之后加载代码。
最后要检查的一件事是确保在加载jQuery之前没有加载任何插件。插件扩展了“$”对象,所以如果你在加载jQuery核心之前加载了一个插件,那么你会得到你所描述的错误。
注意:如果你加载的代码不需要jQuery运行,它不需要放在jQuery ready处理程序中。这些代码可以使用document.readyState来分隔。
它可能是在jquery脚本被调用之前,你已经调用了你的script标签。
<script type="text/javascript" src="js/script.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
这个结果是没有定义$
把jquery.js放在你的脚本标签之前,它会工作;)像这样:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="js/script.js"></script>
当在asp.net中使用jQuery时,如果你正在使用一个母版页,并且你正在加载jQuery源文件,请确保在所有jQuery脚本引用之后有头部内容占位符。
我有一个问题,任何使用该母版页的页面都会返回“$ is not defined”,仅仅是因为错误的顺序使客户端代码在jquery对象创建之前运行。所以确保你有:
<head runat="server">
<script type="text/javascript" src="Scripts/jquery-VERSION#.js"></script>
<asp:ContentPlaceHolder id="Header" runat="server"></asp:ContentPlaceHolder>
</head>
这样代码将按顺序运行,并且您将能够在子页面上运行jQuery代码。
在视图和主布局中使用脚本部分。
将视图中定义的所有脚本放在视图的scripts部分中。通过这种方式,您可以让主布局在所有其他脚本加载后加载此脚本。这是启动一个新的MVC5 web项目时的默认设置。不确定早期版本。
视图/ Foo / MyView.cshtml:
// The rest of your view code above here.
@section Scripts
{
// Either render the bundle defined with same name in BundleConfig.cs...
@Scripts.Render("~/bundles/myCustomBundle")
// ...or hard code the HTML.
<script src="URL-TO-CUSTOM-JS-FILE"></script>
<script type="text/javascript">
$(document).ready(function () {
// Do your custom javascript for this view here. Will be run after
// loading all the other scripts.
});
</script>
}
视图/共享/ _Layout.cshtml
<html>
<body>
<!-- ... Rest of your layout file here ... -->
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)
</body>
</html>
注意脚本部分是如何在主布局文件中最后呈现的。
首先,您需要确保加载了jQuery脚本。这可能来自CDN或本地网站。如果你在尝试使用jQuery之前不先加载这个,它会告诉你jQuery没有定义。
<script src="jquery.min.js"></script>
这可能是在HEAD或页脚,只是确保你加载它之前,你试图调用任何其他jQuery的东西。
然后,您需要使用以下两种解决方案之一
(function($){
// your standard jquery code goes here with $ prefix
// best used inside a page with inline code,
// or outside the document ready, enter code here
})(jQuery);
or
jQuery(document).ready(function($){
// standard on load code goes here with $ prefix
// note: the $ is setup inside the anonymous function of the ready command
});
请注意,很多时候$(document).ready(function(){//code here});不会起作用。
如果jQuery插件调用在</body>旁边,并且你的脚本是在</body>之前加载的,你应该让你的代码在窗口后运行。Onload事件,像这样:
window.onload = function() {
//YOUR JQUERY CODE
}
`
因此,您的代码将只在窗口加载后运行,此时所有资产都已加载。此时,将定义jQuery($)。
如果你使用它:
$(document).ready(function () {
//YOUR JQUERY CODE
});
`
$现在还没有定义,因为它是在jQuery加载之前调用的,你的脚本在控制台的第一行就会失败。
这个错误意味着jQuery还没有加载到页面上。使用$(document).ready(…)或其任何变体都没有好处,因为$是jQuery函数。
使用窗口。Onload应该在这里工作。注意,只有一个函数可以分配给window.onload。为了避免丢失原始的onload逻辑,你可以像这样装饰原始函数:
originalOnload = window.onload;
window.onload = function() {
if (originalOnload) {
originalOnload();
}
// YOUR JQUERY
};
这将执行最初分配给window的函数。onload,然后执行// YOUR JQUERY。
有关装饰器模式的更多详细信息,请参阅https://en.wikipedia.org/wiki/Decorator_pattern。