2009-06-23 2 views
2

다음 confirmDialog 함수는 다른 jquery 함수의 중간에 호출됩니다. 이 confirmDialog가 true를 반환하면 다른 함수는 계속 진행되어야하지만 ... 그렇지 않습니다. 그 이유는 continueButton이 클릭 될 때까지 전체 confirmDialog 함수가 이미 실행 (false 반환) 한 것으로 보입니다. 버튼을 클릭 할 때까지 아무 것도 반환하지 못하게하려면 어떻게해야합니까?클릭이 발생할 때까지 함수가 반환되지 않도록 지연하는 방법

(나는 잘못된 궤도에 완전히있어 경우 또는, 문제가 무엇이며 어떻게 해결합니까?)

function confirmDialog(message) { 
.... 
    $('input#continue', conf_dialog).click(function() { 
     $(this).unbind(); 
     $('p',conf_dialog).fadeOut().text('Are you really sure you want to '+message).fadeIn(); 
     $(this).click(function() { 
      $(conf_dialog).remove(); 
      return true; 
     }); 
    }); 
    $('input#cancel', conf_dialog).click(function() { 
     $(conf_dialog).remove(); 
     return false; 
    }); 
} 

답변

0
function callingFunction() { 
    $('a').click(function() { 
    confirmDialog('are you sure?', dialogConfirmed); 
    // the rest of the function is in dialogConfirmed so doesnt 
    // get run unless the confirm button is pressed 
    }) 
} 

function dialogConfirmed() { 
    // put the rest of your function here 
} 

function confirmDialog(message, callback) { 
    ... 
    $('input#continue', conf_dialog).click(function() { 
    callback() 
    $(conf_dialog).remove(); 
    return false; 
    }), 
    $('input#cancel', conf_dialog).click(function() { 
    $(conf_dialog).remove(); 
    return false; 
    }) 
    ... 
} 
+0

Thsi는 제가 따라온 접근 방식입니다. 원래 함수에 변수가있는 경우 confirmDialog 함수에이 함수를 전달한 다음 그 함수를 전달해야한다는 점을 추가해야합니다. – wheresrhys

1

임 '하지 당신이 할 수 있는지 확인하십시오. confirm, alert 또는 prompt과 같은 AFAIK 전용 내장 함수는 답변을 요청하는 동안 차단 될 수 있습니다.

일반적인 해결 방법은 코드를 리팩터링하여 콜백을 사용하거나 내장 함수를 사용하는 것입니다. 따라서 두 가지로 호출자 함수를 분할하고 입력이 얻어지면 두 번째 부분을 실행하는 것입니다. 다음 기능은, 당신이 이벤트가 confirmDialog가 실행하지 않을 경우 해고 될 때 실행됩니다 이벤트 핸들러를 설정하는 confirmDialog에서

http://www.w3schools.com/htmldom/met_win_settimeout.asp

0

당신은 시간 제한을 추가 할 수 있습니다. 또 다른 문제는 이벤트 함수 내에서 true 또는 false를 반환하므로 외부 함수 confirmDialong에는 적용되지 않습니다.

버튼 프레스에 의존하는 부분을 다시 고려해야합니다. 아마 다른 함수에 넣어, 그리고 클릭 핸들러에서 호출 :

var afterConfirm = function(bool) { 
    if(bool) { 
     //continue clicked 
    } else { 
     //cancel clicked 
    } 
    //do for both cases here 
} 

//inside confirmDialog input#continue 
$(this).click(function() { 
    $(conf_dialog).remove(); 
    afterConfirm(true); 
}); 
1

당신은 이연 개체를 사용하여 조사 할 수 있습니다. 그것들을 설명하는 두 개의 링크가 있습니다. 사용

http://www.sitepen.com/blog/2009/03/31/queued-demystifying-deferreds/

http://api.dojotoolkit.org/jsdoc/1.3/dojo.Deferred

이연 당신은 당신의 전화 기능이 걸릴 수 :

function doSomething() { 
    // this functions does something before calling confirmDialog 
    if (confirmDialog) { 
    // handle ok 
    } else { 
    // handle cancel 
    } 
    // just to be difficult lets have more code here 
} 

과 같은 뭔가를 리팩토링 :

function doSomethingRefactored() { 
    // this functions does something before calling confirmDialog 

    var handleCancel = function() { /* handle cancel */}; 
    var handleOk = function() { /* handle ok */}; 
    var doAfter = function() { /* just to be difficult lets have more code here */}; 

    var d = new dojo.deferred(); 
    d.addBoth(handleOk, handleCancel); 
    d.addCallback(doAfter); 
    confirmDialog(message, d); 
    return d; 
} 
  • ConfirmDialog는 대신 진정한 또는 false
  • 를 반환하는) (d.callback 전화) 또는 d.errback (업데이트해야 할 경우 해봐요은 해봐요 그것을 추가 할 수 있습니다 끝날 때까지 기다릴 필요가 를 호출하는 기능 콜백 체인

희망이 도움이 자사 자신의 기능 ... 그것은 sitepen 기사를 읽은 후 더 많은 이해가됩니다.

관련 문제