2013-03-03 23 views
1

我想做自定義確認功能。如何使功能如確認

所以,我做出這樣的代碼:

function confirm(msg){ 
    var obj = document.createElement("div"); 
    var body = document.createElement("div"); 
    body.innerHTML = msg; 

    var foot = document.createElement("div"); 

    var ok = document.createElement("div"); 
    ok.innerHTML = "OK"; 

    var cancel = document.createElement("div"); 
    cancel.innerHTML = "Cancel"; 

    foot.appendChild(ok); 
    foot.appendChild(cancel); 
    obj.appendChild(body); 
    obj.appendChild(foot); 

    document.getElementsByTagName("body")[0].appendChild(obj); 

    ok.onclick = function(){ 
    return true; 
    } 

    cancel.onclick = function(){ 
    return false; 
    } 
} 

returnValue = -1; 
ok.onclick = function(){ 
    returnValue = true; 
} 

canacel.onclick = function(){ 
    returnValue = false; 
} 

while(true){ 
    if(returnValue !== -1) break; 
} 

return returnValue; 

如果這個自定義功能確認必須得到1個參數像原來確認的功能。

如何讓自定義功能確認?

+2

你不能這樣做在JavaScript中睡覺,因此不可能取代了確認,並直到用戶選擇的東西有它暫停執行。你需要使用回調。 – epascarello 2013-03-03 06:17:37

回答

1

就個人而言,我會用已經爲此寫了一third-party dialog,寫一個jQuery插件,或至少採取更加面向對象的方法。就目前而言,您正在將confirm函數放入global namespace(其中confirm函數已存在)。

另外請注意,你不能停止頁面的執行,等待像window.confirm可以響應。請參閱:How can I reproduce the "wait" functionality provided by JavaScript's confirm() function?(其中接受的答案是「你不能」)。

執行這種任務的可用的方法是使用一個回調:

function customConfirm(message, resultCallback){ 

    ok.onclick = function(){ 

     // note that you can pass whatever you want to the callback 
     // you are not limited to one parameter. 
     resultCallback(true); 
    } 

    cancel.onclick = function(){ 
     resultCallback(false); 
    } 
} 

在上述例子中,resultCallback是定義爲在確認框執行響應動作(一個或多個)事件的函數。

你可以通過一個消息和回調的對象來實現單參數目標,但我懷疑真正的目標是取代window.confirm哪些(如所述)的行爲不同。

{ message: "foo", callback: function bar(status){ alert(status); } } 
+0

這個自定義功能確認必須獲得1個參數 – WebEngine 2013-03-03 06:13:18

+0

這確認定製功能必須得到1點的參數,因爲它會使用CMS像WordPress或XpressEngine,其他CMS .. 所以,這個定製功能確認必須能夠使用像原來確認的功能。 – WebEngine 2013-03-03 06:17:11

+0

我明白了。所以你試圖*替換默認的'window.confirm'函數? – 2013-03-03 06:17:49

1

你不能讓你的confirm函數暫停,直到找到一個值,否則整個頁面都會凍結。你在這種情況下,需要的是提供一個回調執行一次任一按鈕被點擊的(如果你不能把它作爲參數以任何理由,你必須使用一個全局變量,或者一個隊列) :

var queue = []; 
function confirm(msg){ 
    ... 
    var callback = queue.shift(); 
    ok.onclick = function(){ 
    callback(true); 
    } 

    cancel.onclick = function(){ 
    callback(false); 
    } 
} 

你使用這種方式:

queue.push(function(returnValue) { 
    if (returnValue) { 
     // Code for "yes" 
    } 
    else { 
     // Code for "no" 
    } 
}); 
confirm("Are you sure?"); 
+0

這個自定義確認函數必須得到1參數 – WebEngine 2013-03-03 06:13:45

+1

@ user2128228我修改了我的答案,所以你可以用一個參數調用它,但現在需要一個單獨的步驟來添加回調。如果您希望它返回所需的值,那麼您的運氣不佳 - 無法使用JavaScript來完成此操作,因爲該頁面將鎖定,直到您的代碼執行完畢(它甚至不會在您的代碼中顯示新創建的DOM元素直到那時)。 – mgibsonbr 2013-03-03 06:19:09