You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测到Safari时阻止指定脚本加载?(JS/jQuery实现)

如何在Safari浏览器中阻止指定脚本加载?

当然可以实现啦!你之前的用户代理检测没成功,大概率是正则没覆盖到所有Safari的UA场景——毕竟现在有些Chrome的UA也会带Safari字样,很容易误判。我给你几个靠谱的方案,分场景来解决:

一、先搞定准确的Safari检测

先替换掉你之前的检测逻辑,用这个更精准的函数,结合navigator.vendor(Safari的vendor固定是Apple Computer, Inc.)来排除Chrome的干扰:

function isSafari() {
  const userAgent = navigator.userAgent;
  // 匹配不含Chrome/Android的Safari UA,同时结合vendor验证
  return /^((?!chrome|android).)*safari/i.test(userAgent) || 
         (navigator.vendor === 'Apple Computer, Inc.' && !/chrome/i.test(userAgent));
}

二、推荐方案:提前阻止脚本加载(最高效)

这种方式从根源上避免脚本加载/执行,比加载后再移除要更高效,分两种情况处理:

情况1:脚本是内联写在页面里的

把原来的脚本包裹在Safari检测的判断里,只有非Safari浏览器才执行:

<script type="text/javascript">
// 先检测是否是Safari
if (!isSafari()) {
  // 非Safari环境才执行目标脚本内容
  var cbuser = {name: '', email: '', message: ''}, 
      access_token = 'Z2SxfM5dRhhjzKsm3Auhbi4', 
      cburl = '//www.domain.com/';
  // 后面的document.write或者其他脚本逻辑也放在这里
  document.write('<script type="text/javascript" src="your-additional-script.js"><\/script>');
}
</script>

情况2:脚本是通过<script>标签引入的

给目标脚本加个ID,然后在页面加载初期检测并移除它:

<!-- 给目标脚本加个唯一ID -->
<script id="blockable-script" type="text/javascript">
var cbuser = {name: '', email: '', message: ''}, 
    access_token = 'Z2SxfM5dRhhjzKsm3Auhbi4', 
    cburl = '//www.domain.com/';
// ...其他脚本内容
</script>

<script type="text/javascript">
// 先定义检测函数
function isSafari() {
  const userAgent = navigator.userAgent;
  return /^((?!chrome|android).)*safari/i.test(userAgent) || 
         (navigator.vendor === 'Apple Computer, Inc.' && !/chrome/i.test(userAgent));
}

// 在脚本执行前检测并移除
if (isSafari()) {
  const targetScript = document.getElementById('blockable-script');
  if (targetScript) {
    targetScript.remove();
    // 清除已经可能被定义的变量,防止残留
    delete window.cbuser;
    delete window.access_token;
    delete window.cburl;
  }
}
</script>

三、备选方案:脚本已加载后禁用其功能

如果没办法提前阻止脚本加载,那就等脚本执行后,覆盖它的核心变量/函数,让它无法正常工作:

if (isSafari()) {
  // 覆盖脚本的核心变量,使其失效
  window.cbuser = null;
  window.access_token = '';
  window.cburl = '';
  
  // 如果脚本有初始化或执行函数,直接替换为空函数
  if (window.scriptInitFunction) {
    window.scriptInitFunction = function() {};
  }
}

这样调整后,应该就能完美实现你要的“Safari下阻止脚本加载/生效”的需求啦~

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:01:18