【问题标题】:Javascript: Change <a href> to match <img src> multiple times on a pageJavascript:更改 <a href> 以在页面上多次匹配 <img src>
【发布时间】:2016-05-16 12:30:41
【问题描述】:

我正在尝试编写一个脚本,它将获取“img src”并将其复制到“a href”。诀窍是我正在处理的这个页面是一个照片库,该脚本需要处理的页面上有多个图像。这需要在页面加载后立即发生。这是我的 HTML:

<!-- Album row 1 -->
<div class="col-md-6 col-sm-6 album">
  <a class = "img-container-alt" href="**this_is_where_the_imgsrc_below/will_end_up.jpg**" data-gallery>
   <div class="photo-overlay"></div>
    <figure>
     <img class="img-responsive album-img" src="**this_is_what_/i_would_like_copied_above.jpg**" alt="">
    </figure>
  </a>
</div> 

诀窍是,就像我说的,让它通过多个与此相同的 div 并动态抓取每个 img src 并将其复制到 div 中它上方的 a href。这是我到目前为止所做的 JS:

    <!-- Script -->
<script type="text/javascript">
window.onload = function abc() {
    console.log('hello')
    var copyto = document.querySelectorAll('.img-container-alt');
    var copy = document.querySelectorAll('album-img');
    for (var i = 0; i < copyto.length; i++) {
        var url = copy[i].src;
        copyto[i].href = url;
    }
}
</script>

当我运行它时,我得到了这个错误: Uncaught TypeError: Cannot read property 'src' of undefined,指的是var url = copy[i].src;。我不确定我的脚本是否是我正在尝试做的最佳选择,但我现在很难过。我对 JS 比较陌生,所以任何帮助将不胜感激。提前致谢。如果我需要澄清任何事情,请告诉我。

【问题讨论】:

    标签: javascript html image href src


    【解决方案1】:

    正如@Ian Devlin 和@t.niese 所指出的,我有两个问题需要解决。首先,我的var url = copy[i].src; 未定义。为什么?因为我在var copy = document.querySelectorAll('.album-img'); 中缺少.,而album-img 是。其次,我无法在var url = copy[i].src; 中获取src,因此我们将其切换为copy[i].getAttribute("src"),并且效果很好。

    这是现在的工作脚本......

        <!-- Script -->
        <script type="text/javascript">
         window.onload = function abc() {
    
         var copyto = document.querySelectorAll('.img-container-alt');
         var copy = document.querySelectorAll('.album-img');
         for (var i = 0; i < copyto.length; i++) {
    
            var url = copy[i].getAttribute("src");
            copyto[i].href = url;
        }
    }
    

    感谢大家的帮助。

    【讨论】:

      【解决方案2】:

      您需要使用document.querySelectorAll('.album-img')(您在album-img 前面缺少.),否则您将搜索标签名称为album-img 的元素。

      您的document.querySelectorAll('album-img') 将返回一个空节点列表,因为在您的html 代码中没有标签名称为album-img 的元素,因此每次访问copy[i] 都会返回undefined

      但无论如何我都会使用另一种方法。我会搜索所有图像,然后检查每个图像是否在 a 元素内,如果是这种情况,则更改该元素的 href

      function find_closest_a(el) {
        while (el) {
          if (el.tagName === 'A') return el;
          el = el.parentNode;
        }
      }
      
      var images = document.querySelectorAll('.album-img');
      for (var i = 0; i < images.length; i++) {
        var aElment = find_closest_a(images[i]);
        if (aElment) {
          aElment.href = images[i].src;
        }
      }
      

      【讨论】:

      • 感谢您指出我失踪的.。有时只需要第二双眼睛......你的建议和@Ian Devlin 的一起是我所需要的。感谢您的宝贵时间!
      • @tman091 检查我在您撰写评论时所做的编辑(添加另一种方法)
      • 非常有趣。我喜欢。由于我需要的是工作,并且页面不会经常更改,所以我现在将坚持原来的循环 - 但不要搞错,我正在为这个页面添加书签!哈哈。再次感谢。
      【解决方案3】:

      你最好使用数据属性,这样你就可以只定位过程中涉及的图像,因此跳过图标等任何东西

      所以,你的 img 标签会变成:

      <img class="img-responsive album-img" src="" alt="" data-copy-target="id_of_relevant_a_tag">
      

      然后在你的 js 中:

      (function () {
          var imgs = document.querySelectorAll('img[data-copy-target]');
          for (var i = 0, len = imgs.length; i < len; ++i) {
              document.getElementById(imgs[i].dataset.copyTarget).href = imgs[i].src;
          }
      })();
      

      将脚本粘贴在页面底部(在结束 body 标记之前)以确保仅在加载 DOM 的其余部分时执行它

      上面的代码我没有正确测试过,但原理是正确的

      我对 JS 使用的方法是把它包装在一个自动执行的闭包中

      【讨论】:

      • 我肯定会在我网站的不同页面中引用这个脚本,因为这使它看起来比我以前做的要容易得多。说得通。谢谢你的时间!但是,其他答案解决了我的问题。
      • 没问题。虽然,我仍然建议至少使用数据属性,而不是依赖查询选择器以正确的顺序返回您的图像和链接。如果您的页面上有可能包含链接或图像的动态内容,那么您的脚本可能会失败
      • 注意到了。我将在今天晚些时候处理的另一个页面上使用该解决方案,因为就内容而言,该页面比我目前正在处理的页面更具动态性。再次感谢!
      • 我的荣幸。如果您在使用其他页面时遇到任何问题,请您好,我会很乐意伸出援手
      【解决方案4】:

      getQuerySelector 返回Nodelistelement objects,所以我怀疑您需要改用.getAttribute("src")

      【讨论】:

      • 所以你提议的不是var copy = document.queryselectorall('album-img'),而是var copy = document.getAttribute("src"),对吗?由于.getAttribute 不是函数,因此它似乎无法以这种方式工作。
      • 不,我的意思是在你的循环中尝试copy[i].getAttribute("src")。但是 t.niese 下面所说的也是正确的。始终调试您的代码并查看值为 null 的位置。
      • 您的copy[i].getAttribut("src") 正是我所需要的。另外,@t.niese 解决了我遇到的其他问题,(在我的album-img... 天哪。)你们两个都帮助了我,你们的答案一起解决了我的问题。非常感谢你们。以后我会参考这个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多