You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

HTML页面禁用F12、右键及Ctrl-U功能失效问题求助

解决HTML页面禁用F12、右键菜单及Ctrl+U的问题

首先,咱们先拆解下你现有代码为啥没达到预期效果:

  • F12的监听用了onkeypress事件,但多数浏览器里F12触发的是keydown事件,所以拦截没生效;
  • 一旦开发者工具已经打开,浏览器会直接跳过页面的键盘事件监听,这时候Ctrl+U自然就失效了;
  • 右键菜单的处理逻辑有点冗余,而且在部分浏览器上兼容性不够;
  • 火狐里连续右键会弹提示,是因为事件阻止得不够彻底。

下面是优化后的代码,能解决大部分问题,同时兼容性更好:

// 禁用右键菜单
document.addEventListener('contextmenu', (e) => {
  e.preventDefault();
  e.stopPropagation();
  return false;
});

// 拦截开发者工具相关快捷键
document.addEventListener('keydown', (e) => {
  // 拦截F12
  if (e.keyCode === 123) {
    e.preventDefault();
    e.stopPropagation();
    return false;
  }
  // 拦截Ctrl+U查看源码
  if (e.ctrlKey && e.keyCode === 85) {
    e.preventDefault();
    e.stopPropagation();
    return false;
  }
  // 拦截Ctrl+Shift+I打开开发者工具
  if (e.ctrlKey && e.shiftKey && e.keyCode === 73) {
    e.preventDefault();
    e.stopPropagation();
    return false;
  }
  // 拦截F1(部分浏览器用F1打开帮助/开发者工具)
  if (e.keyCode === 112) {
    e.preventDefault();
    e.stopPropagation();
    return false;
  }
});

// 监听开发者工具是否打开(部分浏览器有效)
// 原理:开发者工具打开后,窗口尺寸会发生明显变化
let lastWindowSize = {
  width: window.innerWidth,
  height: window.innerHeight
};

setInterval(() => {
  const currentWidth = window.innerWidth;
  const currentHeight = window.innerHeight;
  // 检测到窗口尺寸突变(大概率是开发者工具打开了)
  if (Math.abs(currentWidth - lastWindowSize.width) > 100 || Math.abs(currentHeight - lastWindowSize.height) > 100) {
    // 这里可以选择刷新页面,或者隐藏页面内容
    window.location.reload();
    // 也可以用:document.body.style.visibility = 'hidden';
  }
  lastWindowSize.width = currentWidth;
  lastWindowSize.height = currentHeight;
}, 1000);

改进点说明

  • 事件监听方式:改用addEventListener替代传统的onkeydown/onkeypress,支持绑定多个处理函数,兼容性更强;
  • 彻底阻止事件:每个拦截逻辑里同时调用e.preventDefault()e.stopPropagation(),确保事件不会冒泡到浏览器层面;
  • 覆盖更多快捷键:新增了对Ctrl+Shift+I(常用的开发者工具快捷键)和F1的拦截,扩大了拦截范围;
  • 开发者工具检测:通过监听窗口尺寸变化,在开发者工具打开时触发页面刷新或隐藏内容,间接阻止用户查看源码(注意:这种方法不是100%靠谱,有些浏览器的开发者工具不会改变窗口尺寸)。

必须说明的局限性

得明确一点:没有任何方法能100%阻止用户查看页面源码。哪怕你禁用了所有快捷键和右键,用户还是能通过这些方式绕过:

  • 浏览器菜单里的“查看页面源代码”选项;
  • 地址栏输入view-source:加上你的页面URL;
  • 禁用JavaScript后访问页面;
  • 用浏览器插件或调试工具直接绕过拦截。

这些措施只能提升门槛,防防普通用户误操作,没法阻止有技术基础的用户看源码。


内容的提问来源于stack exchange,提问作者sirut

火山引擎 最新活动