confirm() 如何在 JavaScript 中工作

How does confirm() work in JavaScript

我在想今天 JavaScript 中的原生函数是如何工作的,我可以跨越 alert() 我认为它必须使用 createElement() 或创建一个元素并使用 innerHTML,但我无法弄清楚创建弹出元素所需的完整代码,并制作两个按钮,然后 return truefalse 基于单击.
乔斯说:

usually JS is async; why is alert special? how and why does it create UI elements in a different way from my own scripts?

这是我想出的代码:

function confirm(message) {
    message = message.replace(/"\n"/g, "<br />")
    createElement();
//The create Element is very complicated to create the text box including message. . .
//These two functions are tied to the button's onclick's.
    function clickOkay() {
        valueToReturn = true
        return true;
    }
    function clickCancel() {
        valueToReturn = true
        return false;
    }
    //here, the user hits the button, and sets valueToReturn
    return valueToReturn;
}

但我不明白它是如何停止后台脚本的,如果可以访问,或者 createElement() 是如何工作的,(但那是另一个问题)

alertconfirmprompt都是浏览器实现的DOM API。它们不会创建 DOM 元素来表示它们,并且它们的功能无法用 JavaScript 完全重新创建,因为您不能强制 JavaScript 引擎等待用户单击您的按钮之一。您只能通过要求包含您创建的对话框结果的回调来接近。

function customConfirm(message, callback) {
    message = message.replace(/"\n"/g, "<br />")
    createElement();
    //The create Element is very complicated to create the text box including message. . .
    function clickOkay() {
        callback(true);
    }
    function clickCancel() {
        callback(false);
    }
}
customConfirm("Hello World!", function (result) {
    console.log(result);
});

confirm()-功能是每个浏览器都为您提供的本机功能。 它不是使用 javascript 创建的。但是,如果您想重现该行为,您可以采用类似于此的方式:

function myConfirm(text, cb){
    
    // We need this later
    var body = document.getElementsByTagName('body')[0];
     
    // First we create a div which holds the alert and give it a class to style it with css
    var overlay = document.createElement('div');
    overlay.className = 'myConfirm';
  
    // The box holds the content
    var box = document.createElement('div');
  
    var p = document.createElement('p');
    p.appendChild(document.createTextNode(text));
  
    // We append the text to the div
    box.appendChild(p);
    
    // Create yes and no button
    var yesButton = document.createElement('button');
    var noButton = document.createElement('button');
    
    // Add text and events to the buttons    
    yesButton.appendChild(document.createTextNode('Yes'));
    yesButton.addEventListener('click', function(){ cb(true); body.removeChild(overlay); }, false);
    noButton.appendChild(document.createTextNode('No'));
    noButton.addEventListener('click', function(){ cb(false); body.removeChild(overlay); }, false);
    
    // Append the buttons to the box
    box.appendChild(yesButton);
    box.appendChild(noButton);

    // Append the box to the Overlay
    overlay.appendChild(box)
    
    // insert the Overlay with box into the dom    
    body.appendChild(overlay);
    
}

myConfirm('Hello there!', function(value){ console.log(value); });
.myConfirm{
  position:fixed;
  width:100%;
  height:100%;
  background:rgba(0,0,0,0.05);
}

.myConfirm>div{
  width:200px;
  margin:10% auto;
  padding:10px 20px;
  border:1px solid black;
  background:#ccc;
}

.myConfirm div p{
  text-align:center;
}

.myConfirm div button{
  width:40%;
  margin:0 5%;
}

这可能是一个自制警告框的实现。
请注意 本机警报是一个 synchronous 函数。这意味着浏览器会停止 JavasScript 引擎,直到警告框关闭。您无法复制该行为,但至少可以为该函数提供一个回调,在单击其中一个按钮时调用该回调。在这种情况下,回调只是将值记录到控制台。

希望我能在这里提供帮助!

更新更新问题
在 JavaScript 刚刚兴起的时代,confirm 是向用户询问特定值的有效方式。 confirmpromptalert 是当今的特殊函数,它们的行为与普通函数完全不同,因为它们破坏了 JavaScript-"flow"。 当你问为什么时:嗯 - 也许在这些日子里拥有功能是件好事。请注意,在早期版本中 alert 看起来像系统消息(在 IE 中仍然如此)。至少在 Firefox 中,即使调用了警报,您现在也可以与浏览器正常交互。
这就是为什么它今天仅用于调试(甚至在这里 console.log 是更好的选择)。

我很确定今天(在 FF 中)警报也是使用 browser-intern html 和 CSS 呈现的。