如何检测到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
相关产品推荐
相关产品推荐

