【问题标题】:jQuery not changing the image source attribute on dynamically created imagejQuery 不会更改动态创建的图像上的图像源属性
【发布时间】:2016-10-25 12:44:55
【问题描述】:

我在点击我的页面时动态创建元素:

                <img
                  src="/imagecache/large/{{ $issue->first()->image  }}"
                  onclick="magazineDetail(
                    '{{ $issue->first()->magazine->id }}',
                    '{{ $issue->first()->magazine->name }}',
                    '{{ $issue->first()->magazine->summary ?: '' }}',
                    '{{ $issue->first()->magazine->image ?: '' }}',
                    '{{ $issue->first()->image  }}'
                    )"
                  >

我通过点击调用这个脚本:

function magazineDetail(id, name, summary, issueImage, magazineImage){
    images = [];
    nextImage = 0;
    loadedImages = [];

    $('#magazine-detail')[0].innerHTML = '<section id="magazine-detail" class="magazine-detail"><div class="large-6 medium-6 small-12 columns"><div class="magazine-hero"><img id="image" src="/imagecache/cover/' + magazineImage + '" alt="' + name + '" /><div class="magazine-preview-nav"><div class="right-arrow" id="forward"><img src="/img/right-arrow-black.svg" /><p>Neste utgivelse</p></div><div class="left-arrow" id="back"><img src="/img/left-arrow-black.svg" /><p>Forrige utgivelse</p></div></div></div></div><div class="large-6 medium-6 small-12 columns"><div class="row"><div class="small-6 columns magazine-title"><h1 id="name"></h1></div></div><p id="summary"></p><img id="issueImage" src="" alt="" /><p></p><button class="button primary expand">Kjøp abonnement - 1 måned gratis</button><button class="button secondary expand">Bla igjennom arkivet</button></div></section>';

    $('#image').attr({"src" : '/imagecache/cover/' + magazineImage, "alt" : name});
    $('#name').text(name);
    $('#summary').text(summary);

    if (issueImage != '') {
      $('#issueImage').html('<img src="/imagecache/medium/"' + issueImage + ' alt="' + name + '">');
    }

    $('html, body').animate({
        scrollTop: $("#magazine-detail").offset().top + 1500
    }, 1700);

    $.getJSON("issue/images",
        { id: id },
        function(result){
          if (result.length < 2){
              $('.magazine-preview-nav').hide();
          } else {
              $('.magazine-preview-nav').show();
          }
          $.each(result, function(i, value){
              images.push(value);
          });
          function imagePreload() {
              preload();
          };
    });

    console.log(images);
}

我在$('#magazine-detail')[0].innerHTML 中创建了&lt;div class="magazine-hero"&gt;&lt;img id="image" src="/imagecache/cover/' + magazineImage + '" alt="' + name + '" /&gt;

然后我有一个函数应该使用单击时创建的id="image" 更改该元素的 src。 这是处理该问题的脚本:

$(document).ready(function () {
    imagesIndex = 0;
    nextImage = 0;
    loadedImages = new Array();

    function preload() {
      console.log('entered');
        for (i = 0; i < 2; i++) {
            if (nextImage < images.length) {
                var img = new Image();
                img.src = '/imagecache/cover/' + images[nextImage];
                loadedImages[nextImage] = img;
                ++nextImage;
            }
        }
    }

    $('#magazine-detail').on('click','#forward', function() {
      imagesIndex++;
      preload();

      if (imagesIndex > (loadedImages.length - 1)) {
          imagesIndex = loadedImages.length - 1;
      }
console.log(loadedImages.length);
console.log(loadedImages[imagesIndex].src);
      $('#image').attr({"src" : loadedImages[imagesIndex].src, "alt" : name});
    });

    $('#magazine-detail').on('click','#forward', function() {
        imagesIndex--;

        if (imagesIndex < 0) {
            imagesIndex = 0;
        }

        $('#image').attr({"src" : loadedImages[imagesIndex].src, "alt" : name});
    });
});

在检查console.logs 时,我看到正在使用preload function 创建新图像,并且正确的image src 正在传递给: $('#image').attr({"src" : loadedImages[imagesIndex].src, "alt" : name});

但是页面上的图像没有被改变。我还应该提一下,当我在页面加载后没有创建这些元素但将它们隐藏时,一切正常。

【问题讨论】:

  • 如果你能提供一个工作 Fiddle 可以帮助你。您的大部分代码都是基于 JSON 数据动态生成的。提供这些也会对您有所帮助。
  • @NikhilNanjappa 最好是制作一个堆栈 sn-p,而不是一个 jsfiddle。只要 stackoverflow 工作,堆栈 sn-p 就可以工作。你可以从这个问题中轻松做到。
  • @IsmaelMiguel - 我不在乎在哪里,只要我们可以调试并帮助它正常。我相信 OP 明白了。
  • 不要直接改变 $("#image") 我认为写 $(document).find("#image") 更好

标签: javascript jquery html css image


【解决方案1】:

$(document).ready(function(){ }); 似乎有一个小错误。

代码有 2 个相同按钮 #forward 的点击事件。可能应该将一个分配给 #back 按钮。

【讨论】:

  • 当然,像这样愚蠢的事情花了我这么多时间,谢谢你注意到这一点!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
相关资源
最近更新 更多