【问题标题】:How do I randomly replace the HREF of a specific URL? innerHTML affects lazy loading如何随机替换特定 URL 的 HREF? innerHTML 影响延迟加载
【发布时间】:2026-01-17 02:45:01
【问题描述】:

好吧,我的头已经一个多星期了,我受不了了。

我的目标是随机替换任何给定页面上特定 URL 的 HREF。

例如: https://example.com/offer/free-pizza/

我的 URL 的某些版本包含查询字符串参数,即我想忽略的 https://example.com/offer/free-pizza/?sliceapp,这就是为什么我明确使用正则表达式来调用我的特定 URL 的引号行:

str.replace(/"https:\/\/example\.com\/offer\/free-pizza\/"/g

我正在使用 Google 跟踪代码管理器中的自定义 HTML 标记部署以下代码。不幸的是,这些链接不包含 ID,所以我不能专门调用它们,所以我正在查看 页面正文中包含的所有内容,换句话说, strong>,这是我正在使用的每个页面的正文。一切都与下面的代码完全一样,除了页面上的延迟加载图像没有出现。

<script>
  function myfunction(){
  var str = document.getElementById("main").innerHTML; 
  var res = str.replace(/"https:\/\/example\.com\/offer\/free-pizza\/"/g, function() {
return ['https://example.com/somewhere-else/', 'https://example.com/offer/free-pizza/'][Math.floor(Math.random() * 2)] 
return Math.floor(Math.random() * (max - min + 1)) + min;
});
  document.getElementById("main").innerHTML = res;
  }
</script>

根据我的故障排除,我知道问题与使用 innerHTML 返回整个 有关。图像和返回的 HTML 显然不适用于那里。所以我开始转而只查看页面上的各个 URL,而不是整个 部分,这样我就可以完全绕过图像问题。

在这一点上,我必须写了几十个变体来尝试实现这一点,但似乎没有任何效果。

var els = document.querySelectorAll("a[href^='https://example.com/offer/']");
for (var i = 0, l = els.length; i < l; i++) {
  var el = els[i];
  el = el.replace(/"https:\/\/example\.com\/offer\/free-pizza\/"/g, function() {
return ['https://example.com/somewhere-else/', 'https://example.com/offer/free-pizza/'][Math.floor(Math.random() * 2)] 
return Math.floor(Math.random() * (max - min + 1)) + min;
})};
</script>

我希望比我聪明得多的人能看到我明显的缺陷,并在考虑到上下文和我的目标的情况下指出我如何以更有效的方式编写这篇文章。

谢谢。

【问题讨论】:

    标签: javascript random href str-replace getelementbyid


    【解决方案1】:

    替换整个文档的innerHTML 的问题在于,您可能会删除(并替换)已附加事件侦听器的 DOM 节点,这会使它们无效。我猜延迟加载机制就是利用了这一点。

    因此,无需替换整个文档的 innerHTML,您可以只遍历锚标记并替换 href 属性:

    document
      .querySelectorAll("a[href^='https://example.com/offer/']")
      .forEach(function (el) {
        el.href = el.href.replace(/https\:\/\/example\.com\/offer\//g, replaceFn);
      });
    
    function replaceFn() {
      return [
        'https://example.com/somewhere-else/', 
        'https://example.com/offer/free-pizza/'
      ][Math.floor(Math.random() * 2)];
    }
    

    【讨论】:

    • 我按照您的建议尝试了这个,但它似乎不起作用。它不会抛出错误,只是不会替换任何 URL。我错过了什么吗? &lt;script&gt; document .querySelectorAll("a[href^='https://example.com/offer/']") .forEach(function (el) { el.href = el.href.replace(/"https:\/\/example\.com\/offer\/free-pizza\/"/g, function() { return ['https://example.com/somewhere-else/', 'https://example.com/offer/free-pizza/'][Math.floor(Math.random() * 2)] return Math.floor(Math.random() * (max - min + 1)) + min; }); });&lt;/script&gt;
    • 您的脚本包含语法错误,有两个返回语句(从技术上讲,秒数永远不会被调用)并且您的 replace 函数中的 needle 有多余的引号.请参阅更新的答案以了解应该可以使用的版本。
    • 我应该在一周前发布这个。这样就解决了!非常感谢!!
    • 将其标记为已解决会很好,如果这解决了您的问题 (;
    • @naeramarth7 对不起!实际使用它的新手,我单击了解决方案旁边的绿色箭头,我认为将其标记为已解决?再次感谢。我真的很感激。