HTML5/jQuery:尝试用不同的图像替换列表中的每个图像

Posted

技术标签:

【中文标题】HTML5/jQuery:尝试用不同的图像替换列表中的每个图像【英文标题】:HTML5/jQuery: Trying to replace each image in a list with a different image 【发布时间】:2013-09-08 22:36:38 【问题描述】:

我正在使用 bxslider。我正在尝试编写一些 jQuery,以便在单击按钮后将滑块中的每个图像替换为不同的图像。

html

<!--Slider list-->
<ul class="bxslider">
    <li><img  src="/img/green1.png" /></li>
    <li><img  src="/img/green2.png" /></li>
    <li><img  src="/img/green3.png" /></li>
    <li><img  src="/img/green4.png" /></li>
</ul>

<!--Button(s)-->
<ul class="colour">
    <li id="blue">Blue</li>
</ul>

jQuery:

(function() 
  // Variables                
  var colourLis= $(".colour").children(),
      listItems = $(".bxslider li img"),
      imgSrc = [ 1, 2, 3, 4, ];

  // Click button
 colourLis.click(function() 
      clickedID = $(this).id;
      listItems.each(function(index) 
          listItems.attr('src', '/img/' + clickedID + imgSrc[index] + '.png');

    );
  );
)();

我知道这看起来和听起来令人困惑,而且我的代码可能非常混乱 - 我对此很陌生!任何一般性建议将不胜感激。

无论如何,上面的 jQuery 的意思是,在单击“蓝色”时,滑块中的四个图像中的每一个都会将其 src 更改为指向新图像,从而更改滑块的内容。

例如/img/green1.png 会变成 /img/blue1.png 和 green2.png 会变成 blue2.png 等等。

问题是,这种方法似乎无法始终如一地工作。我似乎无法确定出了什么问题,但控制台经常告诉我它只为每个实例加载图像 4。 (即点击按钮后,blue4.png 将被插入到每个 li 中)。

如果有人可以帮助我,那就太好了!

我愿意接受更好的方法来做到这一点。正如我所说,我是新手,所以不确定进行这种操作的最佳方法是什么。我希望这个函数能够缩放,这样我就可以有多个不同的按钮,即蓝色、红色、橙色等。

提前致谢。

【问题讨论】:

【参考方案1】:

由于 colourLis 可以包含多个项目,因此您无法像现在这样可靠地使用 id 属性,因此您需要专门获取您单击的项目的 id。您还可以单击,并且每个函数都嵌套了错误的方式。

(function() 

//Variables                
var colourLis= $(".colour").children(),
    slideImage = $(".slideimage"),
    listItems = $(".bxslider li img"),
    imgSrc = [ 1, 2, 3, 4, ];

//Click button
colourLis.click(function() 
    // Get the ID of the item clicked
    clickedID = $(this).id;
    // For each image in list
    listItems.each(function(index) 
        slideImage.attr('src', '/img/' + clickedID + imgSrc[index] + '.png');    
    );
);
)();

【讨论】:

嗨,马特,是的,你是绝对正确的。我进行了您建议的更改,还摆脱了无用的 slideImage 变量,而只使用了 listItems 。尽管如此,仍然将每个图像 src 更改为 #4。谢谢! 请使用.on('click', ...) 而不是.click() - 它有助于提醒您这是一个事件处理程序注册,而不是“点击触发器”调用。【参考方案2】:

以下是我处理该代码的方式。我会删除所有不必要的变量(除非您打算稍后更改它们,在这种情况下您绝对应该坚持使用变量),并重新组织嵌套结构:

var imgSrc = [ 1, 2, 3, 4 ];

$('.colour li').on('click', function() 
    var col = $(this).attr('id');
    $('.bxslider li img').each(function(i) 
        $(this).attr('src', '/img/' + col + imgSrc[i] + '.png');
    );
);

如果你愿意,你甚至可以去掉imgSrc

【讨论】:

这太棒了!我根据您的规范清理了代码,突然循环似乎又开始工作了。我将进行更多测试,然后确定这是否已经解决了它。谢谢! 太棒了!别客气。定义变量时要小心,始终考虑是否真的需要它们,了解作用域和闭包,因为 javascript 在污染全局变量作用域时可能相当敏感,因为一切都发生在客户端。 感谢您的建议,我会采纳的。我刚刚玩过它,现在唯一的问题是 col 似乎返回未定义。 $(this).attr('id'); 而不是 $(this).id;。这里的工作示例:jsfiddle.net/ezUwa 完美运行!非常感谢,我现在就回答这个问题。

以上是关于HTML5/jQuery:尝试用不同的图像替换列表中的每个图像的主要内容,如果未能解决你的问题,请参考以下文章

替换的 InnerHtml 显示为字符串

请教各位大神,如何用python提取出两幅图像中不同的部分

python - 用两个不同列表中的值替换列表的布尔值[重复]

通过使用不同的文件作为翻译列表,用 AWK 替换字段

用NSAttributedString中的图像替换微笑

Java Swing,尝试用图像图标复选框替换 JTable 中的布尔复选框