Как определить, готов ли объект в JS? - PullRequest
0 голосов
/ 29 октября 2010

Мое веб-приложение содержит элемент управления ActiveX.Тем не менее, когда я запускаю приложение, я периодически получаю ошибку «объект ожидается».Иногда кажется, что элемент управления не готов, когда я вызываю его свойства / методы.Есть ли способ определить, готов ли объект с помощью JS?

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 29 октября 2010

Если это не ваше собственное приложение, посмотрите, можете ли вы определить какое-либо безвредное свойство или метод, а затем спроектировать метод-оболочку для вызова, который проверяет с помощью 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");});
0 голосов
/ 05 ноября 2010

Способ, которым мы делаем это в FireBreath (http://firebreath.org) - это запуск события в javascript; он делает это, предоставляя имя функции в теге

, получает ссылку на указатель IDispatch окна браузера и делаетPROPERTYGET для функции, названной в теге param.

Затем мы вызываем этот метод, когда плагин готов к работе. Это дает преимущество в том, что он работает практически одинаково во всех браузерах, поскольку плагины FireBreath работают какЭлементы управления ActiveX и плагины NPAPI.

0 голосов
/ 29 октября 2010

Если это ваше собственное приложение, включите событие readystate

http://msdn.microsoft.com/en-us/library/aa751970%28VS.85%29.aspx

...