문제

jQuery Alerts 대화 상자 라이브러리를 사용하려고합니다. http://abeautifulsite.net/notebook/87 기본 알림 대신 (내 의견으로는 꽤 끔찍해 보입니다). 이것은 훌륭한 라이브러리 인 것처럼 보이지만 JCONFIRM 라이브러리를 사용하는 방법의 예는 없습니다.

나는 다음과 같은 일을해야합니다.

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');
        }
    }

그리고 .NET 버튼에서 내 전화 :

플러그인 웹 사이트 (오늘 아침)에 댓글을 올렸고 Google이 JavaScript를 검색하고 결과없이 콜백이 완료되기를 기다렸습니다.

나머지 JavaScript가 실행되기 전에 콜백을 올바르게 사용하는 방법에 대한 아이디어가 있습니까?

감사.

도움이 되었습니까?

해결책

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

이것은 비동기 코드를 사용하여 발생하는 일련의 사건에 대한 오해를 배신합니다. 인라인으로 글을 썼다고해서 엄격하게 최상위 내전을 실행한다는 의미는 아닙니다.

  1. JCONFIRM이 호출되어 기능을 매개 변수 중 하나로 수신하여 기억합니다.
  2. JCONFIRM은 페이지에 UI를 표시하고 즉시 반환합니다.
  3. 'if (response == true)'라인이 실행됩니다. 실제로 이것은 단지 'if (응답)'를 읽어야합니다. 부울 비교는 불필요합니다. 그러나 어쨌든 응답은 물론 거짓입니다. 당신의 기능은 포기하고 종료되어 브라우저에 대한 제어를 제공합니다.
  4. 사용자는 JCONFIRM의 UI를 클릭합니다.
  5. JCONFIRM은 이제 만 행동에 뛰어 들어 당신이 준 함수를 다시 호출하고 이전에 기억했습니다.
  6. 중첩 함수는 'if (response == true) 조건이 무엇이든 수행하기에는 너무 늦었습니다.

대안으로 "// 응답을 기다리는 것"을 작성했지만 실제로 할 수있는 JavaScript 코드는 없습니다. 브라우저가 처리가 진행되는 JCONFIRM UI의 클릭 이벤트를 발사하기 전에 기능이 브라우저에 다시 제어되도록 기능을 반환해야합니다.

비동기 코드가 동기식 컨텍스트 (및 그 반대로)에서 작동하도록하는 방법, 특히 스레드 및 코 루틴 (및 제한된 관계 생성기)이 존재합니다. 그러나 JavaScript에는 이러한 기능이 없으므로 라이브러리가 사용중인 동기 또는 동기성 모델에 맞게 코드를 작성해야합니다.

다른 팁

당신은 JavaScript에서 큰 제한을 쳤다. 코드가 비동기 세계에 들어가면 전형적인 절차 실행 흐름으로 돌아갈 수있는 방법이 없습니다.

예에서 솔루션은 응답이 채워지기를 기다리는 루프를 만드는 것입니다. 문제는 JavaScript가 처리 능력의 100%를 취하지 않고 무기한으로 루프 할 수있는 명령을 제공하지 않는다는 것입니다. 따라서 브라우저를 차단하게됩니다. 때로는 사용자가 실제 질문에 대답 할 수없는 시점까지.

여기서 유일한 해결책은 비동기 모델을 고수하고 유지하는 것입니다. 제 조언은 발신자가 기능 끝에 무언가를 실행할 수 있도록 비동기 작업을 수행 해야하는 모든 기능에 콜백을 추가해야한다는 것입니다.

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');
})

콜백은 비동기식이므로 (적어도 사용자가 무언가를하기를 기다리고 있다는 의미에서) 콜백 내부에 필요한 것을 처리하는 것이 더 쉬울 수 있습니다.

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

@klogan [댓글

나는 당신이 이것을 얻었다고 생각합니다 여기?

페이지는 당신에게 당신의 답을줍니다 : (아래 봐 용법)

이 메소드는 확인 () 및 프롬프트 ()와 동일한 값을 반환하지 않습니다. 콜백 함수를 사용하여 결과 값에 액세스해야합니다. 자세한 내용은 데모를 참조하십시오.)


@klogan

내가 만들려고하는 요점은 원하는 것을 성취하는 쉬운 방법이 없다는 것입니다. 당신은 연관 시키려고합니다 절차 그리고 이벤트 중심 프로그래밍 - JavaScript가 도움이되지 않습니다.

가장 단순한 위험한) 솔루션은 의사-인피 나이트 루프를 사용하는 것입니다. 그러나 만약 callback 절대 전화를받지 않으면 이제 실제 무한 루프가 있습니다. 그리고 JavaScript 엔진에 따라 브라우저 대기를 죽일 수 있습니다.

가리키다: 가장 좋은 방법은 피하는 것입니다 이것 이벤트 중심을 절차로 강요하려고합니다.

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;
}

기술적으로 , 그러나 나는 웹 사이트에서 그렇게하지 않을 것입니다.

보세요 이야기 JavaScript, 이는 기반입니다 자기애 스.

내러티브 JavaScript는 비동기 이벤트 콜백의 차단 기능을 차단할 수있는 JavaScript 언어의 작은 확장입니다. 이로 인해 비동기 코드는 새로 읽을 수 있고 이해할 수 있습니다.

셀렌 이 기술을 사용합니다.


업데이트

체크 아웃 자바 스크립트 가닥:

JavaScript Strands는 JavaScript 언어에 Coroutine 및 협력 스레딩 지원을 추가하여 비동기 이벤트 콜백을위한 차단 기능을 가능하게합니다. 이로 인해 비동기 조작을 훨씬 더 선형적이고 읽기 쉽고 관리 가능하게하는 코드가됩니다. Strands는 Neil Mix가 작성한 내러티브 JavaScript를 기반으로하며, 많은 이야기 JavaScript는이 문서의 대부분을 포함하여 Strand에 남아 있습니다.

JavaScript에서 귀하의 코드는 이벤트가 시작될 때까지 단순히 기다릴 수 없습니다. 이벤트는 항상 별도의 비동기 이벤트 핸들러로 처리해야합니다. 때때로 이것은 괜찮지 만 종종 간단한 진술이 어두운 연소에 있어야하는 것을 강요합니다. 또한 호출 기능이 콜백 처리기를 제공하기 위해 알아야하기 때문에 기능을 캡슐화하는 기능을 중단합니다. 스트랜드는 실행 스레드를 중단하고 재개 할 수있는 기능을 제공합니다. 이벤트가 완료되면 실행이 이력서를 중단 할 수 있습니다. 이를 통해 구현을 캡슐화하는 간단하고 선형 읽기 가능한 코드로 읽기 어려운 비동기 이벤트 처리를 작성할 수 있습니다.

나는 당신이 이와 같은 응답을 잡아야한다고 가정합니다. 나는 당신이 콜백이 필요하다고 생각하지 않습니다.

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

나는이 문제에 대한 가능한 해결책을 생각해 냈다고 생각합니다. 나는이 기사를 읽고 있었다 :http://tresise4developer.wordpress.com/2008/06/23/calling-postback-event-from-javaScript/

기본적으로 아이디어는 JavaScript의 포스트 백을 강요한다는 것입니다. 처음에는 포스트 백이 작동하지만 버튼 이벤트를 호출하지는 않지만 기사를 읽은 후 JavaScript Postback인지 여부를 발견 할 수 있음을 알았습니다. 처리 방법

dotnetshadow를 고려하십시오

친구들이 말한 방법, 방법이 없습니다! 그러나 ... 우리 나라 (브라질)에서 우리가 말하는 방법, Le Gambi :

우리는 그런 일을 할 수 있습니다.

<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}"/>

그리고 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;
}

같은 문제이지만 jQuery-UI를 사용합니다.

Bye와 나는 이것이 누군가를 도울 수 있기를 바랍니다.

콜백을 메시지를 전송하는 것으로 생각하면 코드에서 구조가 더 좋을 것입니다.

이 일이 작동합니다. 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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top