Начало работы

Полный пример подключения и инициализации JC-WebClient. Реализованы следующие шаги:

  1. Загрузка скрипта JCWebClient.js.
  2. Инициализация JC-WebClient.
  3. Цикличная проверка версии JC-WebClient.
// 1. Загрузка скрипта JCWebClient.js
getJCWebClient({
    onLoad: function() {
        // Скрипт JCWebClient.js загружен и модуль JCWebClient2 установлен
        console.log('JC-WebClient установлен');

        // 2. Инициализация JC-WebClient
        JCWebClient2.initialize();
        console.log('JC-WebClient был успешно инициализирован');

        // 3. Цикличная проверка версии JC-WebClient
        checkJCWebClientVersion(function() {
            // Версия JC-WebClient корректна
            console.log('Версия JC-WebClient корректна. Продолжаем работу...');
        });
    },
    onError: function(error) {
        // Скрипт JCWebClient.js не загружен

        this.onError = undefined; // очищаем callback для того, чтобы код ниже выполнился только самый первый раз

        // Отобразите пользователю информационное сообщение о необходимости установить JC-WebClient.
        // В этом же сообщении сообщите о том, что загрузка инсталлятора JC-WebClient на ПК пользователя
        // начнётся автоматически, но если не началась в течение, например, 5 секунд,
        // предложите нажать на специальную ссылку для скачивания инсталлятора с Web-сервера.
        console.log('Установите JC-WebClient !!!');
    }
});

/* Цикличная проверка версии JC-WebClient.
   Асинхронная функция.

   @param done - callback-функция, срабатывающая при успешной проверке версии JC-WebClient.
*/
function checkJCWebClientVersion(done) {
    var failureCount = 0; // Счетчик некорректных версий

    // Начать проверку версии JC-WebClient
    checkVersion();

    // Внутренняя функция проверки версии JC-WebClient
    function checkVersion() {
        // Получение версии JC-WebClient
        JCWebClient2.getJCWebClientVersion({
            async: true,
            onResult: function(version, error) {
                if(typeof(error) !== 'undefined') {
                    // Можно обработать ошибки в соответствии с бизнес-логикой
                    console.log('Ошибка получения версии JC-WebClient: ' + error);
                }

                // Проверка версии JC-WebClient
                if(/* Условие некорректности version */) {
                    // Версия не подходит
                    ++failureCount;

                    if(failureCount === 1) {
                        // Сообщите пользователю о том, что для корректной работы Web-приложения необходима версия JC-WebClient, отличная от текущей.
                        // Это сообщение отобразится только самый первый раз
                        console.log('Обновите JC-WebClient !!!');
                    }

                    // Повторная проверка версии JC-WebClient после 2-х секундного таймаута
                    setTimeout(function() {
                        checkVersion();
                    }, 2000);
                    return;
                }

                if(failureCount !== 0) {
                    // Перезагрузить страницу, т.к. ранее был подключен JC-WebClient неподходящей версии
                    window.location.reload();
                    return;
                }

                // Версия JC-WebClient корректна
                done();
            }
        });
    }
}

/** Цикличная загрузка модуля JCWebClient2. Асинхронная функция.

    @param params - объект с callback-функциями:
        onLoad - функция срабатывает при успешной установке модуля JC-WebClient. Может быть вызвана только один раз;
        onError - функция срабатывает неудачной установке модуля JC-WebClient. Может быть вызвана несколько раз.
*/
function getJCWebClient(params) {
    // Проверка наличия модуля JC-WebClient на Web-странице
    if (typeof(JCWebClient2) !== 'undefined') {
        // Модуль JCWebClient2 установлен
        params.onLoad();
        return;
    }

    // Получение скрипта JC-WebClient
    getScript(
        'https://localhost:24738/JCWebClient.js',
        params.onLoad,
        function(error) {
            if(typeof(params.onError) === 'function') {
                params.onError(error);
            }

            // Повторная попытка получения скрипта после 2-х секундного таймаута
            setTimeout(function() {
                getJCWebClient(params);
            }, 2000);
        }
    );
}

/** Функция загрузки скрипта.
    @param src - адрес расположения скрипта;
    @param done - callback-функция, срабатывающая при успешной загрузки скрипта;
    @param fail - callback-функция, срабатывающая при неудачной загрузки скрипта.
*/
function getScript(src, done, fail) {
    var parent = document.getElementsByTagName('body')[0];

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = src;

    if (script.readyState) {  // IE
        script.onreadystatechange = function () {
            if (script.readyState === "loaded" || script.readyState === "complete") {
                script.onreadystatechange = null;
                // На некоторых браузерах мы попадаем сюда и в тех случаях когда скрипт не загружен,
                // поэтому дополнительно проверяем валидность JCWebClient2
                if (typeof (JCWebClient2) === 'undefined') {
                    onFail("JCWebClient is invalid");
                }
                else {
                    done();
                }
            }
            else if (script.readyState !== "loading") {
                onFail("JCWebClient hasn't been loaded");
            }
        }
    }
    else {  // Others
        script.onload = done;
        script.onerror = function() {
            onFail("JCWebClient hasn't been loaded");
        };
    }

    parent.appendChild(script);

    function onFail(errorMsg) {
        parent.removeChild(script);
        fail(errorMsg);
    }
}