【问题标题】:Remove <script> tags using jQuery使用 jQuery 删除 <script> 标签
【发布时间】:2011-03-06 08:52:09
【问题描述】:

我想使用 jQuery 删除这个 Google Analytics 块。

<script type="text/javascript">
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
    try {
        //var pageTracker = _gat._getTracker("xxx");
        pageTracker._trackPageview();
    } catch(err) {}
</script>

原因

因为我正在为基于客户端规范的 jQuery 创建一个定制的屏幕阅读器转换器。困扰我的是 Google Analytics。

问题

它适用于.remove(),直到您离开,然后按返回。 Google Analytics 挂起。

【问题讨论】:

  • 您可以删除这些元素,但我认为这不会满足您的要求...此时脚本已经运行。
  • 您是否要验证表单数据?如果是这样,这不会阻止攻击者。服务器端验证是必要的。
  • 不,我正在创建一些定制的基于 Javascript 的屏幕阅读器功能。
  • 有人知道吗?快把我逼疯了!!
  • 是什么阻止您直接从源代码中删除 GA 代码?是否有服务器端脚本语言?

标签: javascript jquery html script-tag


【解决方案1】:

试试这个:

var replacementDoneIn = $(document.body).text(); //remove Google Analytics document.write line
        var regExMatch = /document\.write\(unescape/g;
        var replaceWith = "//document.write";
        var resultSet = replacementDoneIn.replace(regExMatch, replaceWith);
        $("body").html(resultSet);

希望有帮助!

【讨论】:

  • 完美,但这确实删除了document.write(unescape 的每个实例,但这对于我目前所需要的来说很好。
  • 请注意,这也会从页面中删除所有事件。
  • 哈哈,当我在 8 小时前说我的不错时,Davids 的评论是如何获得 3 次赞成的? - 随机 stackoverflow 用户:)
【解决方案2】:

您还可以在停止之前挂钩 document.write 并检查其谷歌分析代码:

<script>
// Must run before google analytics though
old_document_write = document.write;
document.write = function(str)
{
     if(/* determine if the str is google analyic code */)
         return false; // dont write it
     else
        old_document_write(str);
}
</script>

【讨论】:

    【解决方案3】:

    所以这如你所愿。至少我认为会:

    <script type="text/javascript">
        $(document).ready(function () {
            $("script").each(function () {
                if (this.innerHTML.length > 0) {
                    var googleScriptRegExp = new RegExp("var gaJsHost|var pageTracker");
                    if (this.innerHTML.match(googleScriptRegExp) && this.innerHTML.indexOf("innerHTML") == -1)
                        $(this).remove();
                }
            });
        });
    </script>
    

    只是为了解释。我遍历页面上的所有脚本标签。如果它们的 innerHTML 属性的长度大于 0,我会检查脚本的 innerHTML 以及是否在其中找到字符串 var gaJsHost 或 var pageTracker。然后我确保我也没有在其中看到 innerHTML,因为我们的脚本中显然会有这些。当然,除非您在使用 src 在页面上加载的脚本中有此代码,在这种情况下,此脚本不会设置 innerHTML 属性,您可以将 if 行更改为只是

    if (this.innerHTML.match(googleScriptRegExp))
    

    希望这就是您想要的。

    【讨论】:

      【解决方案4】:

      要实际删除元素,jQuery('script:not([src^=http])').remove() 将起作用。

      【讨论】:

      • 你的意思是从“查看源代码”?如果是这样,JS中没有解决方案。但是,它确实会从 dom 中删除任何没有 src 的脚本块。如果您想全部删除,只需使用jQuery('script').remove()
      • 你不能使用他们的位置(使用 eq())吗?当然,这只有在每个页面上的脚本顺序相同时才有效。
      • 问题在于没有选择正确的脚本。到它可以运行时,Google Analytics 已经被解析并运行了。上面 Ryano 的解决方案之所以有效,是因为它会加载页面、解析脚本,然后实质上使用解析后的版本重新加载页面。
      猜你喜欢
      • 1970-01-01
      • 2022-12-05
      • 2018-11-30
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2012-01-05
      • 2011-10-27
      相关资源
      最近更新 更多