我的网络应用包含一个ActiveX控件。但是,当我运行应用程序时,间歇性地出现错误“对象预期”错误。当我调用它的属性/方法时,似乎有时控件还没有准备好。有没有办法可以使用JS检测对象是否已准备就绪?
非常感谢。
答案 0 :(得分:1)
如果它不是您自己的应用程序,看看您是否可以识别一些无害的属性或方法,然后围绕使用try catch测试的调用设计一个包装器方法,如果它可以访问该对象,如果是,则调用链中的next方法(可能使用委托包含参数,如果没有准备好,请使用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");});
答案 1 :(得分:0)
如果是您自己的应用,请添加一个状态正常的活动
http://msdn.microsoft.com/en-us/library/aa751970%28VS.85%29.aspx
答案 2 :(得分:0)
我们在FireBreath(http://firebreath.org)中执行此操作的方法是将事件触发到javascript;它通过在< param>中提供函数名来实现这一点。 tag,获取对浏览器窗口IDispatch指针的引用,并为param标记中指定的函数执行PROPERTYGET。
然后我们在插件准备就绪时调用该方法。这具有在所有浏览器中以相同方式工作的优点,因为FireBreath插件可用作ActiveX控件和NPAPI插件。