Не удается скрыть / отключить элементы при использовании тайм-аутов - PullRequest
0 голосов
/ 04 апреля 2011

Я пытаюсь отключить кнопку, скрыть список выбора и показать текст после нажатия кнопки ... из-за того, сколько времени может занять JavaScript, я использую тайм-ауты, чтобы предотвратить блокировку браузера и завершение его браузеромпреждевременно или с предупреждением ... однако код, который у меня есть, похоже, не скрывает / не отключает / не показывает элементы после нажатия кнопки.

Редактировать: Я подтвердил, чтоэлементы скрываются и затем отображаются повторно, однако их повторное отображение выполняется слишком рано ... JavaScript не завершил выполнение своих задач, и они отображаются почти мгновенно после их скрытия.

Редактировать 2: Исправлено путем перемещения кода, который показывает список выбора и т. Д. Из функции «addCatsSICMain», в функцию «addCatsSIC», как показано ниже.

if (spot < cats.options.length) {    
    other code here...
} else {
    reshow select list etc code here
}

Вот код:

Эта первая функция вызывается при нажатии кнопки.

function addCatsSICMain() {

    // Set elements
    var addBtn = document.getElementById('add');
    var cat_sel = document.getElementById('cat_sic_sel_wrapper');
    var addWait = document.getElementById('addWait');

    // Disable add button
    addBtn.disabled = true;

    // Hide selected list
    cat_sel.style.display = 'none';

    // Show waiting text
    addWait.style.display = 'block';

    // Use a timeout function so button can be hid/show when we want successfully & not on function completion

    setTimeout(function(){

        // Add selected cats
        addCatsSIC(0);

        // Reshow selected list, reenable add button & hide wwaiting text
        addWait.style.display = 'none';
        cat_sel.style.display = 'block';
        addBtn.disabled = false;

    }, 10);

}

function addCatsSIC(spot) {

    // Set the search results box
    var cats = document.getElementById('cat_sic_list');

    // Set the selected categories list that we are adding to..
    var sel_cats = document.getElementById('cat_sic_sel'); 

    // Set selcted counter var
    var sel_count = 0;

    // Set category add failed var
    var failed = 0;

    // Set batch size for looping
    var batchSize = 50;    

    // Still more to do?

    if (spot < cats.options.length) {    

        // Loop through categories from the search results select box

        for (var i = spot; i < spot + batchSize && i < cats.options.length; i++) {

            // Check if the cat is selected

            if (cats.options[i].selected == true) {

                // Set this category's values to some variables
                var cat_id = cats.options[i].getAttribute('value');
                var cat_name = cats.options[i].text;     

                if (checkCatSICAdd(cat_id) === false) {           

                    // Now we create the new element
                    var new_option = document.createElement('option');

                    // Add attribute
                    new_option.setAttribute('value',cat_id);

                    // Create text node
                    var new_text_node = document.createTextNode(cat_name);

                    // Append new text node to new option element we created
                    new_option.appendChild(new_text_node);

                    // Append new option tag to select list
                    sel_cats.appendChild(new_option);

                } else {
                    failed++;
                }

            }

        }

        var nextBitOfWork = function() { addCatsSIC(spot + batchSize) };

        // Hand control back to the browser so it can update the page & not timeout & then restart the function
        setTimeout(nextBitOfWork, 50);

    }

    if (failed > 0) {

        // Find out if more than 2 cats were selected

        for (var i = 0; i < cats.options.length; i++) {
            if (cats.options[i].selected == true) {
                sel_count++;   
            }
            if (sel_count == 2) {
                break;
            }
        }        

        // Give them an alert they have added that category already
        /*addedCatSICAlert(sel_count);*/

    }

}

Ответы [ 2 ]

0 голосов
/ 05 апреля 2011

Исправлено путем перемещения кода, который показывает список выбора и т. Д. Из функции «addCatsSICMain», в функцию «addCatsSIC», как показано ниже.

if (spot < cats.options.length) {    
    other code here...
} else {
    reshow select list etc code here...
}
0 голосов
/ 04 апреля 2011

Любая причина, по которой вы не используете для этого jQuery.Вы можете отключить кнопку, скрыть поле выбора и показать элементы, выполнив следующую

$('button').click(function() {
    $(this).attr('disabled', 'disabled');
    $('select').hide();
    $('p').show();
})

проверку рабочего примера на http://jsfiddle.net/N697c/1/

...