删除showModalDialog API

随着即将从各种浏览器中删除showModalDialog API,我们公司像许多其他提供大规模企业Web应用程序的公司现在面临着一个重大的困境。

虽然我们已将showModalDialog的调用集中到3行代码,但我们广泛依赖此代码来提供模态用户提示的反馈(快速搜索解决方案显示大约2400个实例)。

我们可以相当容易地删除showModalDialog并将其替换为基于Javascript / css的替代方案,这不是问题。 我们面临的问题是所有的调用代码将不再阻塞,例如

 if(doConfirm(...)) { ... } else { ... } 

由于引入了非阻塞替代方案,上述内容将会失败。 我们也不能使用内置的阻塞方法(警报,确认),因为在许多情况下对话框按钮是自定义的,并且还可以设置样式以适应我们的应用程序。

基于以上所述,是否有任何实用的解决方法/解决方案可以用来避免重新考虑这么多传统的先前阻塞代码?

您不会使用基于事件的异步代码。

实用的解决方法,以避免必须手动重新分解代码?

您可以尝试将await关键字带到js的javascript-to-javascript编译器。 它应该自动将您的代码转换为异步版本。

免责声明:我没有使用过这些

您可以通过使用我的showModalDialog polyfill避免使用回调函数,该函数会暂停后续语句的执行,直到模式关闭为止。 它通过使用generator,promises和yield关键字来实现。 它适用于最新的Opera和Google Chrome。

在jQuery的1.11.4版本中,你可以使用一个内置的

,它还允许在close上捕获一个回调参数。

  $("#dialog").dialog({ autoOpen: false, width: 500, height: 500, modal: true buttons: [ { text: "Ok", click: function () { $(this).dialog("close"); } }, { text: "Cancel", click: function () { $(this).dialog("close"); } } ] }); 

您可以通过按钮单击事件在回调函数中捕获您的值。

你甚至可以添加HTML来将你自己的’x’按钮附加到现有的“关闭”按钮并隐藏原始文件,这样你就可以做任何你想做的事情:

  $(document).ready(function () { var closeHtml = '×'; $("button[title='Close']").css('display', 'none').parent().append(closeHtml); }); 

然后将click事件附加到’x’按钮的dialog-close ID:

  var url = 'https://www.cnn.com'; // Link to open the dialog $("#dialog-link").click(function (event) { var dialog = $("#dialog"); dialog.dialog("open"); dialog.html(''); $("#dialog-close").on('click', function (e) { // ...do whatever you want here, then... $("button[title='Close']").click(); //e.preventDefault(); //dialog.close(); }); event.preventDefault(); }); 

只有警告,因为它使用IFrame,如果网站上的安全性阻止将外部网站引入您自己的网站,如果您以这种方式使用它,它可能无效。 例如,谷歌阻止了这种用途。

这应该是一个跨平台的例子 – 我已经在IE 11中测试了它。“Polyfill”,我见过其他人说是另一种方法,不是,并且不能在IE中工作,因为它依赖于Promise ,IE不支持,如本页底部所示: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise