As funções JavaScript são executadas sem esperar por funções nas linhas acima para retornar?

StackOverflow https://stackoverflow.com/questions/2026847

Pergunta

Apliquei uma função a um botão de envio do formulário. Quero que a função exiba uma caixa de diálogo Iframe e aguarde a interação do usuário e envie o formulário (por meio de uma postagem Ajax).

Mas o comportamento que estou vendo é que a caixa de diálogo é exibida, mas a função continua executando e faz a postagem do Ajax, mesmo que a chamada da caixa de diálogo ainda não tenha retornado. Preciso de alguma maneira de interromper a execução do código até que essa função de diálogo retorne.

Eu tenho algo como:

submitForm: function () {   

        <call a function that pops up a dialog, doesn't return until user interacts> 

        new Ajax.Updater('dialogContainer', url, {
                ...........
            }
        });      

        return false;
    }

Eu acho que esse é o comportamento esperado do JavaScript, mas não tenho certeza de como contornar isso ...

Foi útil?

Solução

JavaScript no navegador será executado sequencialmente, então obviamente sua chamada para iniciar a caixa de diálogo Iframe não Aguarde a interação do usuário e retorna imediatamente. Meu palpite é que qualquer biblioteca que você está usando para exibir sua caixa de diálogo terá algum tipo de função de retorno de chamada que ela será executada com base na ação do usuário. Então você só precisa mover o seu new Ajax.Updater(....); Code em uma função de retorno de chamada.

Outras dicas

Com base em um conhecimento básico que tenho do JavaScript, acho que esse é o comportamento normal, desde que a caixa de diálogo execute independentemente do seu código (o código chamado).

Sua caixa de diálogo tem algum JavaScript em execução? Porque eu acho que, se houver, talvez você possa passar uma função como um parâmetro (retorno de chamada que executará o código que você deseja) que será chamado na caixa de diálogo quando retornar.

Eu diria que você deve chamar a primeira função também através do Ajax. E acho que você está usando protótipo.

Você tem função de retorno de chamada completa nos objetos Ajax.Request e Ajax.Updater. Em seguida, na função onComplete pode executar a segunda função.

Curti

oComplete: function () {new ajax.updater ('dialogContainer', url, {...........}}); }

Se o seu cliente da Web de destino for apenas o Internet Explorer, você poderá usar o Windows.showModaldialog. Ele tem a bela propriedade de bloquear o tópico JavaScript na janela pai.

O showModaldialog foi implementado no Firefox, mas não sei se a função está bloqueando no Firefox.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top