65.9K
CodeProject 正在变化。 阅读更多。
Home

修复“Microsoft JScript 运行时错误:'__pendingCallbacks[...].async' 为空或不是对象”

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.32/5 (16投票s)

2008年7月3日

CPOL

1分钟阅读

viewsIcon

67023

本文档解释了在使用回调面板时,如何修复 ASP.NET 框架中的一个错误。


引言

我最近在使用 ASP.NET 回调组件时遇到了一个运行时错误。

Microsoft ASP.NET 标准库中存在一个错误。

修复这个错误比较复杂,因为你需要修改你无法访问的源代码。

我找不到一个完整的逐步指南来修复这个错误,因此我决定发布完整的代码。

背景

在运行页面时,我遇到了一个错误

"Microsoft JScript runtime error: '__pendingCallbacks[...].async' 
					is null or not an object"

错误发生在这一行。

// ORIGINAL CODE FROM MICROSOFT 
function WebForm_CallbackComplete() {
    for (i = 0; i < __pendingCallbacks.length; i++) {
        callbackObject = __pendingCallbacks[i];
        if (callbackObject && callbackObject.xmlRequest && 
		(callbackObject.xmlRequest.readyState == 4)) {
            WebForm_ExecuteCallback(callbackObject);
            if (!__pendingCallbacks[i].async) {
                __synchronousCallBackIndex = -1;
            }
            __pendingCallbacks[i] = null;
            var callbackFrameID = "__CALLBACKFRAME" + i;
            var xmlRequestFrame = document.getElementById(callbackFrameID);
            if (xmlRequestFrame) {
                xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);
            }
        }
    }
} 

问题

看起来错误出现在 for (i=0; 中,并且是问题的核心。i 变量是一个全局变量,它可能会在循环内被改变。

解决方法是添加 var 关键字,使变量成为局部变量。
在互联网上搜索,你可能会发现有些人也建议将 WebForm_ExecuteCallback 移动到循环的较低位置。

修复方案

为了修复你的页面,你只需要在页面的开头插入这段代码。我个人把它放在 body 中。
<script type="text/javascript">
//<![CDATA[
var GlvDelayedNextPageNo;

function WebForm_CallbackComplete_SyncFixed() {
     // the var statement ensure the variable is not global
     for (var i = 0; i < __pendingCallbacks.length; i++) {
        callbackObject = __pendingCallbacks[i];
        if (callbackObject && callbackObject.xmlRequest && 
			(callbackObject.xmlRequest.readyState == 4)) {
            // SyncFixed: line move below // WebForm_ExecuteCallback(callbackObject);
            if (!__pendingCallbacks[i].async) { 
                __synchronousCallBackIndex = -1;
            }
            __pendingCallbacks[i] = null;
            var callbackFrameID = "__CALLBACKFRAME" + i;
            var xmlRequestFrame = document.getElementById(callbackFrameID);
            if (xmlRequestFrame) {
                xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);
            }
            // SyncFixed: the following statement has been moved down from above;
            WebForm_ExecuteCallback(callbackObject);
        }
    }
}

var OnloadWithoutSyncFixed = window.onload;

window.onload = function Onload(){
    if (typeof (WebForm_CallbackComplete) == "function") {
        // Set the fixed version
        WebForm_CallbackComplete = WebForm_CallbackComplete_SyncFixed;
        // CallTheOriginal OnLoad
        if (OnloadWithoutSyncFixed!=null) OnloadWithoutSyncFixed();
    }
}
//]]>
</script> 

关注点

这是因为在重载 onload 函数时,你可能会改变其他组件的行为。

正确的方法是重写 onload ,但在新的 onload 中,调用之前的那个。

这并非什么高深的技术,但可能也不是对每个人来说都很明显。

© . All rights reserved.