禁用上下文菜单和复制粘贴(输入字段除外)

Disable context menu and copy-paste except on input fields

提问人:Hashim Aziz 提问时间:11/14/2023 最后编辑:Hashim Aziz 更新时间:11/14/2023 访问量:32

问:

我有一个客户,由于内容的质量及其在 SEO 中的重要性,许多内容经常直接从竞争对手的网站上撕下来。为了尽可能防止这种情况,客户端希望禁用右键单击上下文菜单以及使用 JavaScript 选择、复制和粘贴文本(我们已经有其他非 JavaScript 措施)。

我已经向他们解释过,这些措施不太可能阻止那些有足够时间和精力的人,但我们都同意,它们将是一个主要的威慑力量,并有助于显着减少内容盗窃的数量,特别是因为那些可能从事这种行为的人是营销人员和/或商人。

此外,网站的性质也意味着除了输入字段之外,这些措施不太可能对用户体验产生太大影响。因此,我怎样才能在整个站点中实现此行为,同时确保仍然可以正常编辑任何输入字段?

JavaScript 表单 事件处理 dom-events

评论


答:

0赞 Hashim Aziz 11/14/2023 #1

这是迄今为止我能够想到的唯一可行的解决方案。任何建议的改进都非常受欢迎,如果有人能想出更清洁/更高性能的解决方案(极有可能),那么请将它们作为答案发布。

function blockEvent(e) {
  e.preventDefault();
  e.stopPropagation();
  return false;
}

function enableEvent(e) {
  e.stopPropagation();
  return true;
}

document.addEventListener("contextmenu", blockEvent);
document.addEventListener("cut", blockEvent);
document.addEventListener("copy", blockEvent);
document.addEventListener("selectstart", blockEvent);
document.addEventListener("dragstart", blockEvent);

let inputs = document.querySelectorAll("input");
Array.prototype.slice.call(inputs).forEach((input) => {
  input.addEventListener("contextmenu", enableEvent);
  input.addEventListener("cut", enableEvent);
  input.addEventListener("copy", enableEvent);
  input.addEventListener("selectstart", enableEvent);
  input.addEventListener("dragstart", enableEvent);
});