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






4.32/5 (16投票s)
本文档解释了在使用回调面板时,如何修复 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
中,调用之前的那个。
这并非什么高深的技术,但可能也不是对每个人来说都很明显。