【问题标题】:How to Disable the CTRL+P using javascript or Jquery?如何使用 javascript 或 Jquery 禁用 CTRL+P?
【发布时间】:2013-09-17 07:36:09
【问题描述】:

在这里我尝试禁用 Ctrl+P 但它没有让我警觉并且它还显示打印选项

jQuery(document).bind("keyup keydown", function(e){
    if(e.ctrlKey && e.keyCode == 80){
        alert('fine');
        return false;
    }
});

http://jsfiddle.net/qaapD/10/

我不确定如何使用 jQuery 或 JavaScript 禁用 Ctrl+P 组合本身。

谢谢

【问题讨论】:

  • 谢谢大家。我正在处理的项目是在您单击打印按钮时打印我们的自定义数据,而不是我在 Stackoverflow 中发布的快捷方式
  • 为什么不支持两者?
  • 如果您 100% 确定您的用户只会使用一个操作系统,这是一种解决方案,但我同意其他 cmets,您也应该支持其他平台。
  • 我建议使用打印样式来显示您想要的自定义数据并隐藏您不想打印的内容。如果您不希望自定义数据出现在屏幕上,您可以使用 css 将其隐藏在屏幕上。这样一来,用户可以使用任何打印页面的方法,并始终得到您希望他们拥有的打印输出。
  • 谢谢你的建议@3dgoo 我终于用css做了

标签: javascript jquery


【解决方案1】:

您无法阻止用户打印,但您可以使用简单的 CSS 在用户打印文档时隐藏所有内容:

<style type="text/css" media="print">
    * { display: none; }
</style>

Updated fiddle.

如果您想在访问者尝试打印时向他/她显示一条自定义消息,而不是只显示一个空白页面,则可以使用客户端代码,但首先像这样包装您现有的所有内容:

<div id="AllContent">
    <!-- all content here -->
</div>

并添加这样一个带有自定义消息的容器:

<div class="PrintMessage">You are not authorized to print this document</div>

现在去掉 &lt;style type="text/css" media="print"&gt; 块,代码将是:

if ('matchMedia' in window) {
    // Chrome, Firefox, and IE 10 support mediaMatch listeners
    window.matchMedia('print').addListener(function(media) {
        if (media.matches) {
            beforePrint();
        } else {
            // Fires immediately, so wait for the first mouse movement
            $(document).one('mouseover', afterPrint);
        }
    });
} else {
    // IE and Firefox fire before/after events
    $(window).on('beforeprint', beforePrint);
    $(window).on('afterprint', afterPrint);
}

function beforePrint() {
    $("#AllContent").hide();
    $(".PrintMessage").show();
}

function afterPrint() {
    $(".PrintMessage").hide();
    $("#AllContent").show();
}

代码取自this excellent answer

Updated fiddle。 (打印时显示信息)

【讨论】:

  • 这样打印除了页眉/页脚以外的空白页会不会浪费墨水和纸张?激怒用户的方式...
  • @BobbyJack 比阻止 CTRL+P 更好,这只会让他们想知道他们的键盘出了什么问题...... :)
  • 如果您绝对必须禁用 Ctrl+p(当然,每个人都知道您不应该这样做),可能会很高兴提到您使用内联消息/弹出对话框完成了它当按下 Ctrl+p 时。
  • 你的代码对我不起作用(FF 31),但是这个非常相似的代码做到了(没有仔细研究原因) :tjvantoll.com/2012/06/15/…(请参阅组合方法
  • Chrome 39.0 和 IE 11.0 也不适用于您的,但至少 IE 11.0 可以与我上面帖子中提到的代码一样运行乙>。也在这里简短地发布:stackoverflow.com/a/11060206/1915920
【解决方案2】:

经过对各种浏览器的大量测试,在按键按下(未按下)时更容易拦截,因为有些“App集成按键”很难通过“keypress”事件进行拦截。

我想出了这个跨浏览器兼容的脚本(我没有测试微软的 IE)。请注意,浏览器会为某些键返回不同的代码。就我而言,我想阻止 Ctrl+P。

chrome上的“P”键是e.keyCode == 80,opera上是e.charCode == 16,而firefox上是e.charCode == 112

$(document).on('keydown', function(e) {
    if((e.ctrlKey || e.metaKey) && (e.key == "p" || e.charCode == 16 || e.charCode == 112 || e.keyCode == 80) ){
        alert("Please use the Print PDF button below for a better rendering on the document");
        e.cancelBubble = true;
        e.preventDefault();

        e.stopImmediatePropagation();
    }  
});

我使用了 jQuery。

【讨论】:

  • 当我使用此代码时,它不会显示打印对话框。没事儿。但是一旦删除alert(..,它就会显示打印对话框agian ...
  • @MikedeKlerk 它对我有用,只需删除警告行(在 Chrome 中)
【解决方案3】:

这基本上是彼得斯从上面的回答。不同的是我在按下 cmd+p 按钮组合打印页面时添加了 mac 的责任。

$(document).on('keydown', function(e) { 
    if((e.ctrlKey || e.metaKey) && (e.key == "p" || e.charCode == 16 || e.charCode == 112 || e.keyCode == 80) ){
        alert("Please use the Print PDF button below for a better rendering on the document");
        e.cancelBubble = true;
        e.preventDefault();

        e.stopImmediatePropagation();
    }  
});

【讨论】:

    【解决方案4】:

    您的代码在 jsfiddle 示例中有效吗?你使用的是什么浏览器?用最新的 chrome 测试了一下,效果很好。

    您还可以添加:

    e.preventDefault();
    

    【讨论】:

      【解决方案5】:

      这实际上在 chrome 中对我有用。我很惊讶。

      jQuery(document).bind("keyup keydown", function(e){
          if(e.ctrlKey && e.keyCode == 80){
               Print(); e.preventDefault();
          }
      });
      

      Print 是我编写的一个函数,它调用 window.print();如果你禁用 Print(),它也可以作为一个纯粹的拦截器;

      如此处所述:https://stackoverflow.com/a/20121038/2102085

      window.print() 将暂停,因此您可以像这样添加 onPrintFinish 或 onPrintBegin

      function Print(){
          onPrintBegin
          window.print();
          onPrintFinish(); 
      }
      

      (这只是 chrome,但 Peter 在下面有一个被否决的解决方案,声称 ff 和 ie 的键码不同)

      【讨论】:

        【解决方案6】:

        在旅途中发现了这个,应该在 keydown 事件中取消

        document.addEventListener('keydown',function(e){
           e.preventDefault();
           return false;
        });
        

        进一步简化为:

        document.onkeydown = function(e){
           e.preventDefault();
        }
        

        假设你只有一个 keydown 事件

        【讨论】:

          【解决方案7】:

          要使用 javascript 禁用 Ctrl+P 打印,请使用以下代码:

          window.addEventListener('keydown', function(event) {
              if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {
                  event.preventDefault();
                  if (event.stopImmediatePropagation) {
                      event.stopImmediatePropagation();
                  } else {
                      event.stopPropagation();
                  }
                  return;
                  }
          }, true);
          

          【讨论】:

            【解决方案8】:

            有些快捷方式你根本无法用 javascript 覆盖,我很难学会。我想 CTRL+P 就是其中之一。

            覆盖它们的一种方法是部署一个 chrome 封装的应用程序。

            【讨论】:

              【解决方案9】:

              试试这个

                  //hide body on Ctrl + P
                  jQuery(document).bind("keyup keydown", function (e) {
                      if (e.ctrlKey && e.keyCode == 80) {
                          $("body").hide();
                          return false;
                      }
                  });
              

              【讨论】:

                【解决方案10】:
                <script>
                      function isKeyPressed(event) 
                      {
                        if(event.ctrlKey == 1)
                        {
                          alert("Please Submit exam form befor printing");
                        }
                      }
                    </script>
                
                <body onkeydown="isKeyPressed(event)">
                <p>this is the solution</p>
                </body>
                

                【讨论】:

                • 请为您的答案写一些描述。
                【解决方案11】:

                如果您想禁止打印您的网页,那是在浪费您的时间:这是不可能的。即使您知道如何捕获 CTRL-P 用户仍然可以使用浏览器菜单栏找到打印命令,或者他们可以截取浏览器的屏幕截图。

                停止试图控制用户,把你的精力放在让你的网站/应用更有用,而不是更有用。

                2016 年编辑:在 3 年中,它已经收集了 3 次反对票。我还是不删。我认为重要的是告诉其他开发人员什么时候给他们不可能的任务,或者没有意义的任务。

                编辑 2018:仍然认为有这个问题的人阅读这个答案很重要。

                【讨论】:

                • 你在猜测作者的意图,合法的使用可能是覆盖 ctrl p 作为作者应用程序中其他内容的快捷方式。
                • 这没有回答问题。
                • 仅仅因为答案没有直接解决问题,不会使其无效。如果它指出了最佳实践并引导提问者远离可能导致危险的路径,那么“你不应该这样做”实际上是一个更好的答案,而不是在没有此类警告的情况下解决问题的答案。
                • @BobbyJack OP 询问如何禁用 Ctrl + P 组合,bjelli 抱怨禁用打印。这不是 UX Stackexchange,我们在这里解决编程问题。
                • @Pavlo:我认为这是一条很好的路线。如果有人发布了非常低效的代码,以及一个询问非常具体且不相关的问题的问题,那么强调低效率可能仍然是件好事。即使有人没有明确要求某事,如果它是有益的,指出它仍然是有帮助的。
                猜你喜欢
                • 1970-01-01
                • 2011-07-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-06-29
                • 2013-11-06
                • 2020-05-03
                • 2014-05-04
                相关资源
                最近更新 更多