1

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

这是一些示例代码:

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

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

3 回答 3

2

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

于 2013-02-22T18:02:14.920 回答
1

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

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

这阻止了我的表单在打印或取消后提交。我还将打印按钮放在表单中:

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

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

于 2020-06-19T16:43:31.723 回答
0

如前所述,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;
}());

请记住,仅使用 JavaScript几乎没有可靠的方法来执行此操作,它可以为您提供取消打印、完成与失败等详细信息。

于 2013-02-22T18:45:53.167 回答