【发布时间】:2010-10-29 11:14:10
【问题描述】:
我的 Web 应用程序包含一个 ActiveX 控件。但是,当我运行该应用程序时,我间歇性地收到错误“预期对象”错误。当我调用它的属性/方法时,有时控件似乎还没有准备好。有没有办法可以使用 JS 检测对象是否准备好?
非常感谢。
【问题讨论】:
标签: javascript object activex controls
我的 Web 应用程序包含一个 ActiveX 控件。但是,当我运行该应用程序时,我间歇性地收到错误“预期对象”错误。当我调用它的属性/方法时,有时控件似乎还没有准备好。有没有办法可以使用 JS 检测对象是否准备好?
非常感谢。
【问题讨论】:
标签: javascript object activex controls
如果它不是你自己的应用程序,看看你是否可以识别一些无害的属性或方法,然后围绕调用设计一个包装方法,用 try catch 测试它是否可以访问该对象,如果是,则调用链中的下一个方法(也许使用委托来包含参数,如果尚未准备好,请使用 setTimeout 在 100 毫秒内再次调用包装器。
您可能希望在几次尝试后包含一个重试计数器以进行救助,以便在对象损坏时它不是无限循环。
例子:
function TryCallObject(delegate, maxtries, timebetweencalls, failCallback, retrycount)
{
if(typeof retrycount == "undefined")
retrycount = 0;
if(typeof failCallback == "undefined")
failCallback null;
try {
//code to do something harmless to detect if objects is ready
delegate(); //If we get here, the object is alive
} catch(ex) {
if(retrycount >= maxtries)
{
if(failCallback != null)
failCallback();
return;
}
setTimeout(function () {
TryCallObject(delegate, maxtries, timebetweencalls, failCallback, retryCount + 1);
}, timebetweencalls);
}
}
它是这样称呼的
TryCallObject(function() { /* your code here */ }, 5, 100);
或
TryCallObject(function() { /* your code here */ }, 5, 100, function() {alert("Failed to access ActiveX");});
【讨论】:
如果是你自己的应用,请包含一个 readystate 事件
http://msdn.microsoft.com/en-us/library/aa751970%28VS.85%29.aspx
【讨论】:
我们在 FireBreath (http://firebreath.org) 中执行此操作的方式是向 javascript 触发事件;它通过在 标记中提供函数名称、获取对浏览器窗口 IDispatch 指针的引用以及为 param 标记中命名的函数执行 PROPERTYGET 来实现此目的。
当插件准备就绪时,我们会调用该方法。这具有在所有浏览器中以几乎相同的方式工作的优势,因为 FireBreath 插件既可以作为 ActiveX 控件工作,也可以作为 NPAPI 插件工作。
【讨论】: