2013-11-28 259 views
5

我在嘗試使用jquery對話框複製javascript的'確認'框。這是我的代碼,jquery ui對話框確認

function customConfirm(customMessage) { 
     $("#popUp").html(customMessage); 
     $("#popUp").dialog({ 
      resizable: false, 
      height: 240, 
      modal: true, 
      buttons: { 
       "OK": function() { 
        $(this).dialog("close"); 
        alert(true); 
        return true; 
       }, 
       Cancel: function() { 
        $(this).dialog("close"); 
        alert(false); 
        return false; 
       } 
      } 
     }); 
    } 

但是,當我試圖提醒這種方法,它顯示'未定義'。它不在等待彈出窗口顯示。我如何使這個customConfirm函數等待用戶輸入(確定/取消)? 我的需求是,customConfirm()方法將根據用戶輸入返回true或false。

回答

7

你需要做的是使用jQuery.deferred /承諾。

http://api.jquery.com/deferred.promise/

在這個例子中,asyncEvent

1)創建一個jquery推遲對象

2)具有用於解決/拒絕,您的確定邏輯/取消

3)返回一個deferred.promise()對象,然後可以與$ .when一起使用來確定延遲對象是否已解析或拒絕(ok/cancel)。

你會做什麼是

1)創建一個jQuery Deferred對象

2)啓動您的對話,以確定/取消設定deferred.resolve /拒絕

3)返回一個deferred .promise()對象,

4)使用延遲承諾的對象與$。當 http://api.jquery.com/jQuery.when/

function customConfirm(customMessage) { 
    var dfd = new jQuery.Deferred(); 
    $("#popUp").html(customMessage); 
    $("#popUp").dialog({ 
     resizable: false, 
     height: 240, 
     modal: true, 
     buttons: { 
      "OK": function() { 
       $(this).dialog("close"); 
       alert(true); 
       dfd.resolve(); 
      }, 
      Cancel: function() { 
       $(this).dialog("close"); 
       alert(false); 
       dfd.reject(); 
      } 
     } 
    }); 
    return dfd.promise(); 
} 

$.when(customConfirm('hey')).then(
    function() { 
    alert("things are going well"); 
}, 
function() { 
    alert("you fail this time"); 
}); 

你也可以只使用決心,並確定是否確認是在$。當真或假,

function customConfirm(customMessage) { 
    var dfd = new jQuery.Deferred(); 
    $("#popUp").html(customMessage); 
    $("#popUp").dialog({ 
     resizable: false, 
     height: 240, 
     modal: true, 
     buttons: { 
      "OK": function() { 
       $(this).dialog("close"); 
       alert(true); 
       dfd.resolve(true); 
      }, 
      Cancel: function() { 
       $(this).dialog("close"); 
       alert(false); 
       dfd.resolve(false); 
      } 
     } 
    }); 
    return dfd.promise(); 
} 

$.when(customConfirm('hey')).then(
    function(confirm) { 

    if(confirm){alert("things are going well");} 
    else{alert("you fail this time");} 
}); 

希望有所幫助。

+0

在jQuery 3.1.0和jQuery UI 1.12.0嘗試創建確認對話框之後,還有其他一些例子。在運行'$ .when()'之前創建一個默認變量。發現在$ .when()完成之前變量已經通過。任何建議或建議? – Twisty

+0

僅供參考 - 我發現我的問題。我正在使用匿名函數,執行後會丟失裏面的變量。轉到已經定義的功能有所幫助。 – Twisty

2

您應該在文檔就緒功能中加載對話框。呼籲customConfirm功能對話框打開,

function customConfirm(customMessage) { 
    $("#popUp").html(customMessage); 
    $("#popUp").dialog("open"); 
    } 

    $(document).ready(function(){ 
    $("#popUp").dialog({ 
     resizable: false, 
     autoOpen: false, 
     height: 240, 
     modal: true, 
     buttons: { 
      "OK": function() { 
       $(this).dialog("close"); 
       alert(true); 
       return true; 
      }, 
      Cancel: function() { 
       $(this).dialog("close"); 
       alert(false); 
       return false; 
      } 
     } 
    }); 

    }); 
+0

它無法正常工作。仍然顯示消息undefined時,我打電話customConfirm –

+0

是'customMessage'參數有什麼價值?試着把它整理一下。 – Masudul

+0

我試過這樣,alert(customConfirm(「customMessage」)); –

7

這就是我使用zepto模塊推遲和回調,像魅力一樣工作。 應該是jQuery的相似或者你可以導入延遲和回調模塊到HTML

function customConfirm(customMessage) { 
    var d = new $.Deferred(); 
    $("#popUp").html(customMessage); 
    $("#popUp").dialog({ 
     resizable: false, 
     height: 300, 
     modal: true, 
     buttons: { 
      "Yes": function() { 
       $(this).dialog("close"); 
       d.resolve() 
      }, 
      "No": function() { 
       $(this).dialog("close"); 
       d.reject(); 
      } 
     } 
    }); 
return d.promise(); 
} 

customConfirm("Do you Want to delete the File?") 
.then(function(){ 
    console.log("You Clicked Yes") 
}) 
.fail(function(){ 
    console.log("You Clicked No") 
}); 
+0

這很好。但是'var d = new $ .Deferred()'後面缺少分號。它應該是'var d = new $ .Deferred();' – steviethecat

+0

謝謝修復。但JavaScript不關心分號。 – pyros2097