Javascript 多个jQuery document.read事件处理程序以错误顺序运行

Javascript 多个jQuery document.read事件处理程序以错误顺序运行,javascript,telerik,jquery,telerik-mvc,Javascript,Telerik,Jquery,Telerik Mvc,我最近在我们的ASP.NET MVC web应用程序中添加了一个功能。当用户单击表中的项目时,会显示一个页面。页面使用AJAX在页面HTML中的单个div中显示部分视图。部分视图使用Telerik Kendo用户界面定义和显示对话框和下拉列表控件。这很复杂,因为JavaScript导入都在页面的视图上,而PartialView只构建要显示在div中的HTML 我在页面上编写的JavaScript包含一个jQuery文档。ready事件处理程序: $(document).ready( fu

我最近在我们的ASP.NET MVC web应用程序中添加了一个功能。当用户单击表中的项目时,会显示一个页面。页面使用AJAX在页面HTML中的单个
div
中显示部分视图。部分视图使用Telerik Kendo用户界面定义和显示对话框和
下拉列表
控件。这很复杂,因为JavaScript导入都在页面的
视图上,而
PartialView
只构建要显示在
div
中的HTML

我在页面上编写的JavaScript包含一个
jQuery文档。ready
事件处理程序:

$(document).ready(
    function () {
        if ( $('#details-map').val() != '' )
            $('#details-map').remove();

        var urlTail = '?t=' + (new Date().getTime());

        // Make the AJAX call and load the result into the details box.
        $('#detailsbox').load('<%= Url.Action("Details") %>' + '/' + '<%: Model.Id %>' + urlTail, displayDetails);
    }
)
在此页面上,我编写的
$(document).ready
事件处理程序在Telerik处理程序之前运行,我的代码显然取决于首先运行的Telerik处理程序。当我的第一次运行时,我得到一个JavaScript错误,它说“jQuery.telerik.load不是一个函数”

由于这不会发生在我的本地主机上,如何确保首先运行第二个文档就绪事件处理程序

编辑:

经过进一步研究,我发现问题在于我的答案中提到的两个脚本,应该通过我的页面使用的母版页中的以下行写入页面:

<%= Html.Telerik().ScriptRegistrar().Globalization(true).jQuery(false).DefaultGroup(group => group.Combined(false).Compress(false)) %>
group.Combined(false).Compress(false))%>

未加载。换句话说,上面的行不起任何作用。但它可以在使用同一母版页的另一个页面上工作。我在该行上放置了一个断点,它正在执行。有人有什么想法吗?

您要么必须让它显示在页面上的第二个之后,要么做一些我不愿建议的事情:

$(document).ready(function() {
    function init {
        /* all your code that needs to be run after telerik is loaded */
    }
    if ( $.telerik ) {
        init();
    } else {
        setTimeout(function check4telerik() {
            if ( $.telerik ) {
                return init();
            }
            setTimeout(check4telerik, 0);
        }, 0);
    }
});

因此,如果
$.telerik
被加载,它会运行,否则它会轮询,直到它被设置,当它被设置时,它会运行代码。这并不漂亮,但如果你没有更多的控制权,它可能是你唯一的选择,除非
$。telerik
发出某种你可以挂接的事件。

在这方面花了几个小时,我终于找到了问题是Telerik
DropdownList
控件和
Window
控件使用的两个JavaScript文件没有加载

在探索页面上的JavaScript时,我遇到了由Telerik生成的脚本:

if(!jQuery.telerik){
jQuery.ajax({
url:"/Scripts/2011.3.1306/telerik.common.min.js",
dataType:"script",
cache:false,
success:function(){
jQuery.telerik.load(["/Scripts/2011.3.1306/jquery-1.6.4.min.js","/Scripts/2011.3.1306/telerik.common.min.js","/Scripts/2011.3.1306/telerik.list.min.js"],function(){ ... });
}});}else{
jQuery.telerik.load(["/Scripts/2011.3.1306/jquery-1.6.4.min.js","/Scripts/2011.3.1306/telerik.common.min.js","/Scripts/2011.3.1306/telerik.list.min.js"],function(){ ... });
} 
这个脚本是通过调用
Html.Telerik.DropdownListFor()发出的
在我的局部视图中。我猜代码中提到的两个JavaScript文件telerik.common.min.js和telerik.list.min.js所包含的代码没有发出,因为调用是在局部视图中进行的。或者我一直都应该包含它们&我不知道(我对这些控件非常陌生).奇怪的是,当我在本地运行时,一切都正常,所以我不明白

在任何情况下,我都在我的
视图中添加了两个
标记,以包含这些文件,并且一切都开始工作。也就是说,我在我的页面中添加了以下标记:

<script type="text/javascript" src="../../Scripts/2011.3.1306/telerik.common.min.js"></script>
<script type="text/javascript" src="../../Scripts/2011.3.1306/telerik.list.min.js"></script>


活到老学到老。

奇怪的是,我在本地主机发出的代码中的任何地方都找不到第二个
文档。ready
事件处理程序。这就引出了这样一个问题:在这种情况下,telerik函数是如何初始化的?我想我必须使用轮询函数。我也不太喜欢它,但我不喜欢它“我不知道如何让我的代码出现在telerik代码之后。我将检查telerik代码中是否有我可以挂接的事件。显然,我认为问题不在于此。我找到了一种方法,使我的文档就绪代码与telerik在其代码之后添加的代码出现在同一块中,但问题仍然存在。”。我甚至尝试添加您的代码,并且定义了$.telerik,因此计时器永远不会运行。我的代码运行到完成,但加载部分后执行的其他代码会出现“jQuery.telerik.load is not a function”错误(在Firefox中;IE和Chrome中会出现类似但不同的消息)。很抱歉,这没有帮助。我对Telerik或剑道一点也不熟悉,所以我可能已经达到了这个问题的知识极限。您可以检查是否存在
$.Telerik&&$.Telerik.load
?我已经解决了这个问题。我将发布另一个答案,解释什么有效。
<script type="text/javascript" src="../../Scripts/2011.3.1306/telerik.common.min.js"></script>
<script type="text/javascript" src="../../Scripts/2011.3.1306/telerik.list.min.js"></script>