如何故意冻结浏览器窗口(如警报、确认和提示)?

Axe*_*xel 5 javascript browser window synchronous

有没有冻结浏览器窗口有意设计为类似的任何方式alertconfirm以及prompt(简称:“ACP”)呢?

我想显示一个带有自定义 css 的模式对话框,而不是“acp”的本机弹出窗口,但也希望能够冻结浏览器,直到我得到用户反馈,就像“acp”一样。

但是人,为什么?这是不好的做法(呃,我必须投反对票)!
所以当这是不好的做法时 - 那么为什么“acp”实际上提供这种同步行为?因为在某些特定场景中,它恰好是适当 UX 的正确工具。那些原生模式确实看起来很丑陋,同时也非常有限。

这只是一个快速而肮脏的示例,在该示例中,在用户提供反馈之前冻结浏览器是完全可以的。假设我们有form一个 -input[type="reset"]元素。因此,在我们真正进行form重置之前,我们会询问用户类似的问题:“您确定要重置吗(数据会丢失)?”。

如果我对本机模态外观(我不是)感到满意,我可以这样做:

var handleSubmit = function( e ) {
  confirm('Are you sure you want to reset (data will be lost)?') || e.preventDefault()
};
$('form').on( 'reset', handleSubmit ); // just using jQuery here for the sake of shortness
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
  <input placeholder="type something, reset and cancel to keep input value" style="width:100%">
  <input type="reset">
</form>
Run Code Online (Sandbox Code Playgroud)

所以“每个人”都应该同意(编辑:或者至少有人可以)这不是坏习惯,对吧?
但是我们如何使用自定义样式的模态/对话框/弹出窗口实现相同的效果?
我当然不是要求HTML/CSS部分,而是要求通过 JavaScript 冻结浏览器窗口的能力!

老实说,我实际上希望对此有一些反对,但也许有一个Killer JavaScript Ninja,他有一个特殊的黑客来使它成为可能......


注意:我确切地知道如何最终达到相同的结果,但我正在寻找一个实际的冻结/同步功能,以保持代码直接并减少黑客攻击。

Sco*_*cus 5

您不能像本机对话框那样冻结浏览器应用程序。这些不是用 JavaScript 构建的,它们是用本机代码构建的,可以以任何方式影响浏览器应用程序。禁止 JavaScript 以此类方式影响客户端应用程序。

但是,您可以在浏览器窗口中冻结与页面内容的交互......

只需div在页面上方放置一个大小固定的窗口即可。这将阻止用户与主页(在它后面)上的任何内容进行交互。然后,在其上显示您的模态对话框。当用户清除模态时,隐藏它和窗口大小的 div,从而使主页面再次交互。

let modal = document.querySelector(".modal");
let pageCover = document.querySelector(".pageCover");
let main = document.querySelector("main");        

document.getElementById("open").addEventListener("click", function(){
  modal.classList.remove("hidden");
  pageCover.classList.remove("hidden"); 
  main.addEventListener("focus", preventFocus);
});


document.getElementById("close").addEventListener("click", function(){
  modal.classList.add("hidden");
  pageCover.classList.add("hidden"); 
  main.removeEventListener("focus", preventFocus);
});

function preventFocus (evt){
  evt.preventDefault();
}
Run Code Online (Sandbox Code Playgroud)
.hidden { display:none; }

.pageCover { 
  position:fixed; 
  z-index:10; 
  background-color:rgba(0,0,0,.25); 
  width:100vw; 
  height:100vh; 
  top:0; 
  left:0;
}

.modal { 
  position:absolute; 
  z-index:100; 
  background-color:aliceblue;
  border:2px double grey;
  width:200px; 
  height:200px; 
  top:30%; 
  left:30%; 
  text-align:center;
}

.modalTitle {
  margin:0;
  background-color:#00a;
  color:#ff0;
  padding:5px;
  font-weight:bold;
  font-size:1.1em;
}

#close { 
  background-color:#800080;
  color:#ff0;
  border:1px solid #e0e0e0;
  padding:5px 10px;
}

#close:hover { background-color:#c000c0; }
Run Code Online (Sandbox Code Playgroud)
<main>
  <h1>This is some page content</h1>
  <p>And more content</p>
  <button id="open">Click Me To Show Modal</button>
  <div>More content</div>
</main>

<div class="hidden pageCover"></div>

<div class="hidden modal">
  <div class="modalTitle">Modal Title Here</div>
  <p>
    Now, you can only interact with the contents of this "modal".
  </p>
  <button id="close" >Close</button>
</div>
Run Code Online (Sandbox Code Playgroud)

  • @Axel 哦,在那种情况下有什么问题,只需使用确认。出于某种原因,我认为您想冻结浏览器并创建一个自定义外观的对话框。这样做当然会很麻烦.. (2认同)
  • @Axel 我不确定你想让每个人说什么,你到底想要什么?,你想要一个花哨的对话框来确认表单的重置。如果你这样做,这是可能的,SO 上的人会很乐意提供帮助。如果您希望 W3C 阅读您的帖子,然后说,好吧,看来我们是时候在 SO 上实施浏览器冻结功能 Axel 了,我不确定它会发生。 (2认同)
  • @Axel 我的回答的第一段是什么意思?你已经得到了好几个人的回答。你似乎只是不喜欢它,但继续争论不会改变它。 (2认同)