【发布时间】:2012-09-26 17:12:30
【问题描述】:
是否可以在 HTML 文档客户端的 <head> 中删除脚本标签,然后再执行这些标签?
在服务器端,我可以在<head> 中的所有其他<script> 标记之上插入一个<script>,除了一个,我希望能够删除所有后续脚本。我无法从服务器端删除 <script> 标签。
我尝试过的:
(function (c,h) {
var i, s = h.getElementsByTagName('script');
c.log("Num scripts: " + s.length);
i = s.length - 1;
while(i > 1) {
h.removeChild(s[i]);
i -= 1;
}
})(console, document.head);
但是,记录的脚本数量只有 1 个,因为(正如@ryan 指出的)代码是在 DOM 准备好之前执行的。尽管将上面的代码包装在 document.ready 事件回调中确实可以正确计算 <head> 中的 <script> 标记的数量,但等待 DOM 准备好无法阻止脚本加载。
是否有可靠的方法在 DOM 准备好之前操作 HTML?
背景
如果您想要更多上下文,这是尝试合并脚本的一部分,其中没有可用的服务器端聚合选项。许多正在加载的 JS 库来自配置选项有限的 CMS。内容大多是静态的,因此无需担心手动聚合 JavaScript 并从不同位置提供它。也欢迎任何有关替代适用聚合技术的建议。
【问题讨论】:
-
是的,根据最后一行传递给匿名函数的参数。
c = console; h = document.head -
所以问题出在这里:您已将一个脚本作为第一个脚本插入到页面中。由于 js 脚本一旦加载就会触发(这就是 document.ready 的原因 - 确保在 js 触发之前文档已完全加载)您的脚本正在运行,发现自己并完成,因为
s.length是 1 和i已经比它大了。 -
尝试将其作为最后一个脚本插入头部。它仍然应该在 dom 的其余部分准备好之前触发,即在加载 html 之前。它还应该在头脑中拾取其他脚本。然后让它删除除最后一个以外的所有内容,例如
for(i = 0; i < s.length -1; i++) -
你有没有试过我上面的评论。至于另一种方式。您必须在要加载的页面的 dom 之外使用某些东西。使用 chrome 扩展程序或 firefox 插件。使用 chrome 扩展,我将使用 chrome api 获取有关 url 更改的传入信息,剥离
-
@RobW IE7 将是首选,但如果这是一个好的答案,我不会因为不支持那么低而拒绝它。指示可能可行的方法 比给定答案中的特定浏览器支持更重要。关键是要防止通过
<head>顶部的脚本评估页面上的所有脚本,这可能会抑制或删除后续脚本。
标签: javascript html browser aggregation