我实际上是这样在我的页面上加载外部JavaScript的:
<script type='text/javascript' src='http://somedomain.com/somescript.php'></script>
注意:这是一个PHP文件,但它产生并返回一个JavaScript代码
然而,脚本有两部分-这是第一部分,我需要:
document.getElementById('latest').innerHTML= "the lastest version of product";
这是第二个,它是不需要的,我需要删除它:
var img = document.createElement("img");
img.src = "http://somedomain.com/tracking.php";
document.getElementsByTagName("body")[0].appendChild(img);
我怎样才能摆脱这一个图像,它跟踪用户,在它将发送数据之前,但留下最新版本的显示完好无损。
与Michael的解决方案类似,应该可以通过先运行一些代码来防止javascript执行。如果在添加脚本之前运行以下命令:
document.getElementsByTagName("body")[0].appendChild = function() {};
他们的脚本将无法将图像添加到dom。如果您需要自己使用该方法,请先将其分配给不同的变量。或者尝试:
var oldMethod = document.getElementsByTagName("body")[0].appendChild;
document.getElementsByTagName("body")[0].appendChild = function(node) {
if (node.src !== "http://somedomain.com/tracking.php") {
oldMethod(node);
}
}
类似于其他人的建议-导致不需要的脚本部分失败,但使用更干净的"块",我们可以抓取img
标识符并阻止它被使用。我们使用Object.defineProperty()
,默认情况下,它创建了一个不可配置、不可写的属性。
Object.defineProperty(window, 'img', {value: null}); // this snatches the identifier
img = document.createElement('img'); // <- this won't work
alert(img); // <- this is null
我不确定它是否会起作用,这是一个黑客,但你可以尝试它与try catch
和const
。const
可以在firefox和chrome上工作,你需要一个safari和旧浏览器的polyfill。
<script>
const img = '';
try {
var script = document.createElement('script');
script.src = 'http://somedomain.com/somescript.php';
document.body.appendChild(script);
} catch (err) {}
</script>
通过定义全局const,它应该在变量赋值时抛出一个错误,然后我们不做任何事情来处理这个错误,所以在抛出错误之前的部分仍然应该被加载,而不会打断脚本的其余部分。
我在我的评论中提到了这一点,但是我认为实现您要求的唯一方法是用AJAX加载脚本(如果服务器允许的话)并解析出错误的代码。这似乎过于复杂,容易出错,而且近乎不道德。我建议你联系脚本somedomain.com
的主机,询问他们是否可以提供一个没有图像跟踪器的版本。如果他们拒绝,那么你应该尊重他们的意愿。毕竟,您想要的是他们的内容(脚本的第一部分),他们完全有权指定您使用它的义务。如果你不喜欢他们的条款,就不要使用他们的内容。
你尝试过CSS吗?
<head>
<style>
img[href *= "somedomain.com/tracking.php"] {
display: none !important;
}
</style>
</head>
<body>
<script src="yourscript"></script>
</body>
这里的关键因素是浏览器会忽略隐藏的图像。因此,您需要将外部脚本移动到正文中。
分析提供商倾向于把自己放在所有事情的顶端(头部),但99.9%的时间没有真正的理由。他们只是觉得自己很重要。