为什么我得到一个“未捕获的ReferenceError:$未定义(匿名函数)”

问题描述:

我有一个CSHTML页面,让这些错误:

Uncaught ReferenceError: $ is not defined    TabNotes:2 
(anonymous function)         TabNotes:2 
TabNotes:12Uncaught ReferenceError: ko is not defined TabNotes:12 
(anonymous function)         TabNotes:12 
(anonymous function)         TabNotes:23 

什么会导致这样的错误?我找不到任何理由。我试着包装的JavaScript函数$(文件)。就绪(函数(){但没有任何工作的代码如下

@model test.Web.Framework.Areas.Administration.Models.TabNotesModel 
@using (UI.DocumentReadyScript()) 
{  
    if (Model.meta.id.HasValue) 
    { 
     UI.jQuery("#tbl" + Model.meta.modelname).flexigrid(Model.Grid); 
    } 
} 
<form method="post" action="@Url.Action("TabNotes", new { cmd = "refresh" })" id="@Model.meta.modelname"> 
<div class="ui-state-highlight ui-corner-all highlight" data-bind="visible: meta.message"> 
    <span class="ui-icon ui-icon-info"></span><strong data-bind="text: meta.message"> 
    </strong> 
</div> 
@using (UI.BeginBlock("Administation.TabNotes", UI.Label("Notes", "Notes").ToString(), test.Web.Framework.Core.enumIcons.pencil, false, false)) 
{ 
    <table id="@("tbl" + Model.meta.modelname)"> 
    </table> 
} 
</form> 
<script type="text/javascript"> 
(function() { 
     var viewModel=ko.mapping.fromJS(@Html.Raw(UI.JavascriptEncode(Model))); 
     viewModel.getData=function() { return ko.mapping.toJSON(this ); }; 
     viewModel.setData=function(data){ 
     $('#tbl'+this.meta.modelname()).flexigrid(data.Grid); 
     ko.mapping.updateFromJS(this,data); 
     }; 
     $('#@Model.meta.modelname').koform({viewmodel: viewModel , validate : {errorElement:'p' } }); 
     $('#@Model.meta.modelname').koform('applyBindings'); 
     $('#load-partial').click(function() { 
      $('#partial').load('@Html.Raw(@Url.Action("CreateNote", "Entity", new {modelEntity = @Model.meta.entity, itemId = @Model.meta.id}))'); 
     }); 
    })(); 
</script> 


<div id="partial"></div> 
<button type="button" id="load-partial">Create Note</button> 

编辑:。 jQuery的会从母版页加载

+2

您是否记得包含jQuery? – Grexis 2012-01-03 23:55:18

这意味着jQuery的($)和基因敲除(ko)中没有定义,这通常出现在当不是由脚本已被执行时加载库。

确保你加载框架在使用它们之前(也就是说,你的框架相关的脚本标签被插入之前你的页面级脚本)。如果这很好,请在开发人员面板中检查您的网络活动,以确定在下载框架时是否收到错误的请求。这可能是因为你在异步加载框架,这意味着你需要一个异步处理程序来开始执行页面级脚本。

+0

jquery和ko被加载到主页面中,不应该总是在页面的其余部分之前加载? – 2012-01-05 17:24:01

+0

@NiekdeKlein:我不确定C#应用程序的结构(我自己使用LAMP堆栈),但这些是我首先检查的第一个可能性。 – 2012-01-05 17:28:03

你的代码中的哪个地方引用了KO和jQuery?通常会发生此错误是因为您的代码在加载引用之前尝试运行。

我建议使用Fiddler或其他网络活动工具来观察何时加载(或不加载)引用以及从何处引用。

+0

它们在主页面中被引用 – 2012-01-06 19:09:58

我试图将jQuery UI小部件合并到我的网站时出现此错误。我不得不更新正在包含的css文件的正确路径;它有时可能会很挑剔。也必须为jquery做同样的事情。还要注意你的本地主机在哪里,关于你的'src =“/ code/blah_folder”的位置。希望能帮助到你。