javascript - 控制 DOM 中的每个“src”属性更改
问题描述
我正在编写一个需要监视新的“脚本”元素并阻止一些已知来源的 Javascript 代码。
为了捕捉这些,我尝试使用MutationObserver和 __ defineSetter __ ,它们都可以观察“src”的变化,但只有在 HTTP 请求已经发送之后——所以即使我改变了 src,它也没有真正被阻止。
window.HTMLScriptElement.prototype.__defineSetter__('src', function (d)
{
console.log("HTMLScriptElement: ",d);
if (d.indexOf('localhost') != -1) {
//BLOCK SCRIPT
}
});
new MutationObserver(function (a) {
a.forEach((e) => {
e.addedNodes.forEach((z) =>
{
if (z.nodeName.toLowerCase() == "script" && z.src.indexOf('localhost') != -1)
{
//BLOCK SCRIPT
}
})
})
}).observe(window.document, {
attributes: true,
childList:true,
subtree:true
});
解决方案
您可以使用服务工作者来拦截网络请求。这样的事情应该可以解决问题:
self.addEventListener('fetch', function (event) {
const blockedUrls = [
//...
];
if (blockedUrls.some(x => event.request.url.startsWith(x))) {
event.respondWith(new Response('blocked', { status: 401, statusText: 'Unauthorized' }));
}
});
推荐阅读
- python - 为什么 BaseDeleteView 会抛出属性错误,说对象没有属性 render_to_response?
- javascript - 箭头函数在三元运算符中不起作用
- asp.net - ASP.NET 我的数据表在 for 循环期间丢失数据
- javascript - 具有反应状态的object.js(无法读取未定义的属性'map')
- html - Vue v-for 指令不呈现正确的 html
- cassandra - 如果在 Apache Cassandra 中,数据中心和机架不直接与物理机架或数据中心相关联,那么如何处理容错?
- laravel - Laravel 类型提示,模型保存时 id 返回 null
- arrays - C:减去数组
- hibernate - 在 Hibernete 多租户环境中,persist() 后无法获取实体 ID
- python - Pandas:将一行字符串分成 4 列;问题:列由逗号、制表符和空格分隔