如何检测JS中的对象是否已准备就绪?

时间:2010-10-29 11:14:10

标签: javascript object activex controls

我的网络应用包含一个ActiveX控件。但是,当我运行应用程序时,间歇性地出现错误“对象预期”错误。当我调用它的属性/方法时,似乎有时控件还没有准备好。有没有办法可以使用JS检测对象是否已准备就绪?

非常感谢。

3 个答案:

答案 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插件。