【问题标题】:prevent form submit if window.print is cancelled如果 window.print 被取消,则阻止表单提交
【发布时间】:2013-02-22 17:59:06
【问题描述】:

我有一个提交表单时打印的表单
但是当我取消打印时,表格仍然提交。

这里是一些示例代码:

<script>  
function printpage()  
{
   window.print();
}
</script>

<form action="" method="post">  
  <input type="text" name="fname">  
  <input type="submit" onclick="printpage()">
</form>

【问题讨论】:

  • 据我所知,window.print() 没有返回任何内容。所以你可以判断他们是否点击了打印按钮,但你无法判断他们是否点击了。
  • 的内部我看不到取消按钮。取消按钮在哪里。另一个,printpage() 函数给你的不是结果,只调用另一个函数 print() 没有包含在 Javascript 代码中。
  • 取消在打印对话框中..
  • 做不到,您无权访问打印对话框,因此您无法知道其中发生了什么
  • 问题重复。你可以在这里找到一些建议:stackoverflow.com/questions/2148145/…

标签: php javascript


【解决方案1】:

windows.print() 不返回状态。您无法知道页面是否打印,因此无法在页面未打印时取消提交。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,即在打印页面或单击打印件上的取消后不希望提交表单。我的解决方案是将我的 JavaScript 内联到我的打印按钮中并添加一个 return false;(参见下面的代码)。

    &lt;button onclick="window.print(); return false;"&gt;Print&lt;/button&gt;

    这使我的表单无法在打印或取消后提交。我还将打印按钮放在表单中:

    <form>
    <button onclick="window.print(); return false;">Print</button>
    </form>
    

    我只测试了这是谷歌浏览器,所以不确定它是否适用于其他浏览器。

    【讨论】:

    • 这种方法对我来说很适合 MS Edge。谢谢。
    【解决方案3】:

    如前所述,window.print() 不返回状态,它是异步的。你可以做一些棘手的事情,比如一旦你触发了对 window.print 的调用,检查鼠标移动(浏览器只会在打印对话框关闭或完成后识别鼠标,但你无法知道它为什么关闭)。

    要明确一点:我在下面列出的任何内容都无法解决问题:无法判断打印是否在 JS 中以编程方式取消。这些只是可能为您提供其他可能性的附加选项。

    IE 也支持onbeforeprintonafterprint 事件...但没有其他支持。

    WebKit 多年来一直存在一个错误来获取此类事件,但它基本上已经死了:https://bugs.webkit.org/show_bug.cgi?id=19937

    但是,如果您支持具有window.matchMedia (https://developer.mozilla.org/en/DOM/window.matchMedia) 可用的浏览器(浏览器支持:http://caniuse.com/#feat=matchmedia),您可能有更多选择。它基本上提供了一个 API 来确定文档是否与 mediaQuery 匹配。其中包括戏剧性的停顿、print 事件。

    类似于(结合 IE 的专有方法和matchMedia):

    (function() {
        var apiMQL = null
            , triggerBeforePrint = function() {
                console.log('Firing Before Print');
            }
            , triggerAfterPrint = function() {
                console.log('Firing After Print');
            }
        ;
    
        if (window.matchMedia) {
            apiMQL = window.matchMedia('print');
            apiMQL.addListener(function(mql) {
                if (mql.matches) {
                    triggerBeforePrint();
                } else {
                    triggerAfterPrint();
                }
            });
        }
        window.onbeforeprint = triggerBeforePrint;
        window.onafterprint = triggerAfterPrint;
    }());
    

    请记住,几乎没有可靠的方法可以使用 just JavaScript 为您提供取消打印、完成和失败等详细信息。

    【讨论】:

      猜你喜欢
      • 2020-06-01
      • 2023-02-08
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      相关资源
      最近更新 更多