Pergunta

Eu estou tentando usar o diálogo jQuery alertas biblioteca de http://abeautifulsite.net/notebook/87 em vez dos alertas padrão (que se parecem bastante horrível na minha opinião). Esta parece ser uma grande biblioteca, mas não é um exemplo de como usar a biblioteca jConfirm.

Eu preciso fazer algo como isto:

function confirm() {
        var result = false;
        var response = false;
        jConfirm('are you sure?', 'Confirmation Dialog',
          function(r) {
            result = r;
            response = true;
            return r;
        });
        if (response == true) {
            alert(result);
            return result;
        }
        else {
            //wait for response
            alert('hi');
        }
    }

e meu telefonema do meu botão .net:

Eu postou um comentário no site do plug-in (apenas esta manhã) e fez pesquisas do Google para JavaScript e à espera de uma chamada de retorno para completar sem resultados.

Algumas ideias sobre como usar o retorno de chamada corretamente para obter o resultado, antes do resto das executa javascript?

Graças.

Foi útil?

Solução

jConfirm('are you sure?', 'Confirmation Dialog',
    function(r) {
        result = r;
        response = true;
        return r;
    }
);
if (response == true) {

Esta trai um mal-entendido da seqüência de eventos que ocorre usando código assíncrono. Só porque você escreveu-lo em linha não significa que ele vai executar estritamente de cima para baixo.

  1. jConfirm é chamado, recebendo uma função como um dos seus parâmetros, o que ele se lembra.
  2. jConfirm exibe sua interface do usuário na página e retorna imediatamente.
  3. As 'Se (resposta == true)' executa linha. Realmente isso deve apenas ler 'se (resposta)', a comparação boolean é supérfluo. Mas, de qualquer resposta de caso é, naturalmente, falsa. Sua função desiste e saídas, devolvendo o controle para o navegador.
  4. O usuário clica UI de jConfirm.
  5. jConfirm só agora entra em ação e chama a função que você deu-lo e ele se lembrou antes.
  6. Seus conjuntos de funções aninhadas de resposta verdadeira, muito tarde para o 'se (resposta == true)' condição de fazer qualquer coisa com ele.

Você escreveu "// espera por resposta" como uma alternativa, mas não existe um código JavaScript que você pode escrever que vai realmente fazer isso. Sua função deve retornar para dar controle de volta para o navegador, antes de o navegador pode disparar os eventos de clique na UI jConfirm que o processamento make prosseguir.

maneiras de tornar o trabalho código assíncrono em um contexto síncrono (e vice-versa) existem - em especial os fios e co-rotinas (e seus geradores relação limitado). Mas JavaScript não tem nenhuma dessas características, então você deve escrever o código para ajustar o modelo síncrono-ou-assíncrona sua biblioteca está usando.

Outras dicas

Você acabou de bater uma grande limitação no JavaScript. Uma vez que seu código entra no mundo assíncrona, não há maneira de voltar a um fluxo de execução processual clássico.

No seu exemplo, a solução seria fazer um loop esperando a resposta a ser preenchido. O problema é que o JavaScript não fornece qualquer instrução que lhe permitirá repetir indefinidamente sem tomar 100% do poder de processamento. Então você vai acabar bloqueando o navegador, às vezes ao ponto onde o usuário não será capaz de responder a questão real.

A única solução aqui é para manter o modelo assíncrono e mantê-lo. Meu conselho é que você deve adicionar uma chamada de retorno para qualquer função que deve fazer algum trabalho assíncrono, de modo que o chamador pode executar algo no final da sua função.

function confirm(fnCallback) 
{
    jConfirm('are you sure?', 'Confirmation Dialog', function(r) 
    {
        // Do something with r 

        fnCallback && fnCallback(r); // call the callback if provided
    });
}

// in the caller

alert('begin');

confirm(function(r)
{
    alert(r);

    alert('end');
})

Uma vez que o retorno de chamada é assíncrona (pelo menos, no sentido de que ele está esperando o usuário a fazer alguma coisa), pode ser mais fácil de lidar com o que você precisa dentro do callback:

function confirm() {
    jConfirm('are you sure?', 'Confirmation Dialog', function(r) {
        if (r) doSomething();
    });
}

@klogan [comentários]

Eu suponho que você tem estes a partir aqui ?

A página dá-lhe a sua resposta: (olhar sob Uso )

Estes métodos não retornam os mesmos valores que confirmam () e prompt de (). Você deve acessar os valores resultantes usando uma função callback. (Veja a demo para mais detalhes.)


@klogan

O ponto que eu estou tentando fazer é que não há realmente uma maneira fácil de realizar o que você quer. Você está tentando correlacionar processual e orientada a eventos programação -. Algo JavaScript não ajudá-lo a fazer

O mais simples (embora, arriscado) solução é usar um loop pseudo-infinito. Mas, se callback nunca é chamado, agora você tem um loop infinito real. E, dependendo do motor de JavaScript, você pode matar a espera browser.

Point: Sua melhor aposta é para evitar este tentando vigor evento-driven em processual

function confirm() {
    var result = false;
    var response = false;

    jConfirm('are you sure?', 'Confirmation Dialog',
      function(r) {
        result = r;
        response = true;
    });

    while(!response) continue; // wait
    return result;
}

Tecnicamente, Sim , mas eu não faria isso em um site.

Dê uma olhada Narrativa JavaScript , que é baseado fora Narciso .

Narrativa JavaScript é uma pequena extensão para a linguagem JavaScript que permite que recursos de bloqueio de chamadas de retorno de eventos assíncronos. Isso faz com que código assíncrono refrescante legível e compreensível.

selênio utiliza esta tecnologia.


Atualização

Confira JavaScript fios :

JavaScript Vertentes acrescenta co-rotina e apoio rosqueamento cooperativa para o linguagem JavaScript para permitir o bloqueio capacidades para evento assíncrono retornos de chamada. Isso faz com que o código que utiliza muito assíncrona operação mais linear, legível e administrável. Fios é construída sobre Narrativa JavaScript escrito por Neil Mix, e grande parte da narrativa JavaScript tem manteve-se em grande parte Strands incluindo esta documentação.

Em JavaScript o seu código não pode simplesmente esperar até que um evento foi acionado - o evento deve sempre ser tratado por um manipulador de eventos separados, assíncrona. Às vezes, isso é bom, mas muitas vezes forças que deveria ser uma simples sequência de instruções em deformado contorções. Ele também quebra o capacidade de funcionalidade encapsulado porque as funções de chamada deve saber para fornecer um manipulador de retorno de chamada. vertentes fornece a capacidade de suspender e retomar threads de execução. Execução pode suspender currículo quando o evento é acabado. Isso permite que você escrever difícil de ler evento assíncrono manipulação de forma simples, linear, de fácil leitura código que encapsula implementação.

Eu diria que você tem que agarrar a resposta como esta. Eu não acho que você precisa de um retorno de chamada.

function confirm() {
        var response = jConfirm('are you sure?', 'Confirmation Dialog');
        if (response) {
            alert(result);
        }
        else {
            //wait for response
            alert('hi');
        }
    }

Eu acho que eu vim com uma possível solução para este problema. Eu estava lendo este artigo: http://treasure4developer.wordpress.com/2008 / 06/23 / chamando-postback-event-de-javascript /

Basicamente, a idéia é que você forçar a postagem de javascript, num primeiro momento eu achei que a postagem iria funcionar, mas não chamaria meu evento botão, mas depois de ler o artigo que eu descobri que eu poderia detectar se era postback javascript e apenas chamar um método para fazer o processamento

Saudações DotnetShadow

Como os caras disse, não há nenhuma maneira! mas ... como usamos a dizer no meu país (Brasil), le Gambi:

nós podemos fazer algo como isto:

<h:commandLink styleClass="linkValor xExcluir" value="x"  
                     onclick="if(confirmar('Confirmar excluir.','Deseja realmente excluir este registro?', this)) return true; else return false;"
                     action="#{mBeanPesquisarLinhas.excluir}"/>

eo javascript:

function confirmar(titulo, msg, elemento) { 

    if ($(elemento).attr('sim')) {      
        $(elemento).removeAttr('sim');      
        return true;
    } else if ($(elemento).attr('nao')) {       
        $(elemento).removeAttr('nao');      
        return false;
    } else {
        $("#dialog-confirm").html('<p>' + msg + '</p>').dialog({
            resizable : false,
            height : 200,
            modal : true,
            title : titulo,
            buttons : {
                "Sim" : function() {
                    $(this).dialog("close");
                    $(elemento).attr('sim', 'sim');
                    $(elemento).click();
                },
                "Não" : function() {
                    $(this).dialog("close");
                    $(elemento).attr('nao', 'nao');
                    $(elemento).click();
                }
            }
        });
    }

    return false;
}

é o mesmo problema, mas usando jquery-ui.

Bye e espero que isso pode ajudar alguém.

Pense sobre retornos de chamada como o envio de mensagens e que irá resultar em uma melhor estrutura em seu código.

Esta coisa funciona. Precisa jQuery.

function myconfirm(kyssa, elm, e){ // neG
    if(jQuery('#confirmquestion').data('result')){
        var V = jQuery('#confirmquestion').data('result');
        jQuery('#confirmquestion').remove(); 
        return V == 'Y' ? true : false;         
    }else if(!jQuery('#confirmquestion').length){
        jQuery('body').append('<div id="confirmquestion">'+
        '<h4>Kinnitus</h4>'+
        '<div id="kyssa">'+kyssa+'</div>'+
        '<center>'+
        '<button onclick="jQuery(\'#confirmquestion\').data(\'result\', \'Y\');">Jah</button>&nbsp;'+
        '<button onclick="jQuery(\'#confirmquestion\').data(\'result\', \'N\');">Ei</button></div>'+
        '</center>');
        jQuery('#confirmquestion button').click(function(){
            jQuery(elm).trigger(e.type);
        })
    }       
    return false;
}

onChange="if(myconfirm(\'Saada kiri: \'+jQuery(this).find(\'option:selected\').html()+\' ?\', this, event)) { ... }"

CSS

#confirmquestion{
    border:1px solid #999;
    background:white;
    padding-bottom: 30px;
    position:fixed;
    width:300px;
    font-size:12px;
    top:45%;
    left:50%;
    margin-left:-150px;
}

#confirmquestion h4 {
    background:blue;
    color:white;
    margin:0;
    padding: 2px 5px;
    border-bottom:#777; 
    text-align:center;
}

#confirmquestion #kyssa {
    padding: 30px 25px;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top