Блокировка элемента для взаимодействия с пользовательским интерфейсом

Я хотел заблокировать div для взаимодействия с пользовательским интерфейсом при вызове на стороне сервера и разблокировать его, как только поток программы вернется на сторону клиента.

Если я не включаю оператор разблокировки, он блокируется после возврата из процесса на стороне сервера. Кажется, что блокировка пользовательского интерфейса активируется после завершения функции щелчка. Поэтому он игнорирует блокировку, когда я выдаю операторы блокировки и разблокировки в одной и той же функции. Если это так? Тогда как я мог добиться желаемого результата. (т.е. блокировка экрана/элемента перед вызовом какого-либо процесса и разблокировка при возврате потока)

Ниже приведен мой пример кода:

$("#button").click(function () {

        //$("#sidebar").block({
        //    message: '<h1>1Processing</h1>',
        //    css: { border: '3px solid #a00' }
        //});

        $.blockUI({
            message: '<h1>2Processing</h1>',
            css: { border: '3px solid #a00' }
        });

        var result = DoSomeServerSideProcessing();

        //$("#sidebar").unblock();
        $.unblockUI();
});


Дополнительная информация:

DoSomeServerSideProcessing() uses XmlHttpRequest() для доступа к серверу. Что я не хотел бы переходить на вызов jQuery ajax, так как он проверен и зрелый блок кода и повторно используется из разных точек кода.

Пример кода:

function DoSomeServerSideProcessing()
{
    var dllUrl=" ... "
    var result = httpGet(dllUrl);
}

function httpGet(theUrl) {
    var xmlHttp = null;

    xmlHttp = new XMLHttpRequest();
    xmlHttp.open('GET', theUrl, false);
    xmlHttp.setRequestHeader('Content-Type', 'text/xml');
    xmlHttp.send(null);
    var strHtml = xmlHttp.responseText;
    xmlHttp = null;

    return strHtml;
}


Обновлять:

Я попытался преобразовать XmlHttpRequest() в $.ajax(). Тем не менее, это не блокирует пользовательский интерфейс. Код ниже:

(Пробовал как с обработчиками beforeSend/complete, так и без них.

//$.blockUI();

//alert("before ajax call")

$.ajax({
    url: theUrl,
    type: "GET",
    dataType: "text",
    async: false,
    beforeSend: function () {
        $.blockUI();
    },
    complete: function () {
        $.unblockUI();
    },
    success: function (result) {
        strHtml = result;
        //$.unblockUI();
    }
});

//alert("after ajax call")

person Khadim Ali    schedule 17.07.2014    source источник


Ответы (2)


Предполагая

DoSomeServerSideProcessing()

это вызов AJAX с обратным вызовом, а функции .blockUI и .unblockUI уже определены где-то еще, я бы сделал так:

    function DoSomeServerSideProcessing(url,callback){
        $.post(url,function(data){
            $.unblockUI();
            callback(data);
        })
    }

    $("#button").click(function () {

        $.blockUI({
            message: '<h1>2Processing</h1>',
            css: { border: '3px solid #a00' }
        });

        var result = DoSomeServerSideProcessing(url,function(data){

        });

    });

Потому что вы хотите, чтобы функция UnblockUI вызывалась после возврата данных.

person WICS2 SRC    schedule 17.07.2014
comment
Смотрите мое обновление в вопросе. Я не использую $.ajax(), так как я могу настроить ваш образец в моем случае? Пожалуйста, предложите. - person Khadim Ali; 17.07.2014

Вам нужно будет поместить метод unBlock в обратный вызов успеха вашего DoSomeServerSideProcessing ajax-вызова.

AJAX является асинхронным, поэтому, пока он обменивается данными с сервером, остальная часть вашего кода будет работать.

person charlietfl    schedule 17.07.2014
comment
необходимо обновить ваш запрос с обратным вызовом onreadystatechange. Проще просто переключиться на jQuery - person charlietfl; 17.07.2014
comment
ХОРОШО. Я попытался преобразовать XmlHttpRequest в $.ajax(). Пожалуйста, смотрите мой код в обновлении выше. - person Khadim Ali; 17.07.2014
comment
:(. Я динамически внедрил jquery.blockUI.js на страницу. Будет ли это иметь значение? - person Khadim Ali; 17.07.2014
comment
определить inject dynamically. Если код действителен в браузере, не имеет значения, как он попадает на страницу - person charlietfl; 17.07.2014
comment
Я имел в виду следующее: document.getElementsByTagName(head)[0].appendChild(scriptBlockUiJs); - person Khadim Ali; 17.07.2014
comment
Теперь я заметил некоторое странное поведение. Когда я вызываю $.blockUI() из $(#dial).click (независимо от любого вызова ajax), он блокирует пользовательский интерфейс. Но когда я вызываю blockUI из метода httpGet(), который вложен в 2 уровня внутри $(#dial).click, он возвращает ошибку в консоли firebug: $.blockUI не является функцией - person Khadim Ali; 17.07.2014
comment
загружается ли библиотека jQuery более одного раза? - person charlietfl; 17.07.2014
comment
Да, но две разные версии. На самом деле я работаю внутри стороннего веб-приложения, которое уже использовало более старую версию jQuery. И для моей цели я добавил последний. Может ли это создать проблему? - person Khadim Ali; 18.07.2014
comment
По поводу моего 2-го последнего комментария (Теперь я заметил....). Это произошло из-за того, что jQuery.BlockUI не загружался на некоторых конкретных страницах из-за условного потока. Ну и после исправления тоже самое, все равно блокуи не работает. На этот раз в консоли нет ошибок. - person Khadim Ali; 18.07.2014
comment
Тем не менее проблема та же. Если я закомментирую оператор разблокировки из обработчика complete, он перейдет в блокировку после возврата из вызова ajax. - person Khadim Ali; 18.07.2014
comment
да, загрузка двух версий jQuery может вызвать много проблем, если не сделать это должным образом. - person charlietfl; 18.07.2014
comment
Что ж, мне удалось преобразовать мой код jQuery в более старую версию jQuery, которая уже была включена в веб-приложение. Теперь на страницу включена только одна версия jQuery. Тем не менее проблема та же. BlockUI не действует при вызове UnblockUI в обработчике complete $.ajax(). И уходит в блокировку на неопределенный срок, если UnblockUI закомментирован. Я предполагаю, что это может быть связано с большим количеством файлов сценариев, уже включенных поставщиком приложения, которые каким-то образом конфликтуют с плагином BlockUI. Может дело в этом? - person Khadim Ali; 23.07.2014
comment
Нет. Но, кажется, теперь я проследил проблему. То есть, когда я комментирую async: false, логика блокировки/разблокировки работает, как и ожидалось. Но данные, возвращаемые ajax, не передаются вызывающей функции. :) - person Khadim Ali; 23.07.2014
comment
никогда не используйте async: false, потребляйте данные в обратном вызове успеха ajax - person charlietfl; 23.07.2014
comment
BlockUI работал с асинхронным вызовом Ajax, но из-за асинхронного характера вызова данные, возвращаемые со стороны сервера, не передавались вызывающей функции. Предложенный WICS2 способ использования обратного вызова (в его ответе ниже) отлично помог контролировать сценарий. Теперь он работает хорошо. - person Khadim Ali; 24.07.2014