【问题标题】:replacing img src attribute w/ jQuery not working用 jQuery 替换 img src 属性不起作用
【发布时间】:2012-07-14 20:59:37
【问题描述】:

我正在尝试创建简单的幻灯片,如果我单击图像,它将变成下一个图像。到目前为止,我在一个名为 1-4 的子文件夹中有四个图像(例如:1.jpg、2.jpg、3.jpg、4.jpg)。 我设置了一个计数器(变量 imgcounter),如果它大于 4,它将重置为 1,我使用此计数器轻松更改 img 元素的 src 名称。

简单版:

$(document).ready(function() {
var imgcounter = 1; 
$('#slide img').each(function() {
    $(this).click(function() {
        if(imgcounter <= 4 ) {
            imgcounter++;
            $(this).attr('src', 'images/' + imgcounter + '.JPG');
        } // end if
        else {
            var imgcounter = 1;
            $(this).attr('src', 'images/' + imgcounter + '.JPG');
        } // end else
    }); // end click    
}); // end each
});  // end ready

在这个版本中,即使我点击它,图像也不会改变。

我也尝试过这种更复杂的方法,在该方法中我放置了一个变量来定义我想用什么来替换 source。我不确定我是否正确使用了 replace() 函数,尤其是在我使用双撇号 '' 表示我要替换整个 src 的部分。我也不确定我是否合法地写出了 replace() 函数的第二部分——'images/' + imgcounter + '.JPG'。

$(document).ready(function() {
var imgcounter = 1; 
$('#slide img').each(function() {
    var imgFile = $(this).attr('src');
    var preloadImg = new Image();
    $(this).click(function() {
        if(imgcounter <= 4 ) {
            imgcounter++;
            preloadImg.src = imgFile.replace('', 'images/' + imgcounter + '.JPG');
            $(this).attr('src', preloadImg.src);
        } // end if
        else {
            var imgcounter = 1;
            preloadImg.src = imgFile.replace('', 'images/' + imgcounter + '.JPG');
            $(this).attr('src', preloadImg.src);
        } // end else
    }); // end click    
}); // end each
});  // end ready

在这个版本中,图像发生了变化,但我得到了一个损坏的图像符号,错误控制台显示: 加载资源文件失败:///..(取出完整路径)../images/1.JPGimages/1.JPG 我不确定为什么它无法替换整个源代码,而是似乎只是在末尾附加了源名称的副本......

提前感谢您的帮助!

【问题讨论】:

  • 嗯,如果我在第一个版本中放置“var imgcounter = 1;”在 click() 函数的正下方,第一次点击有效并且图像发生变化。但是,如果我再次单击该图像,它将不会移动到下一个图像。
  • 您实际上并不需要.each() 函数。此外,您要在 else 块中重新声明变量 imgcounter
  • 嗯,你是对的。没听懂。如果我有多个图像元素,我需要一个 each() 函数吗?
  • $("#slide img") 选择#slide 的所有子元素img,所以不,我认为你不会。

标签: jquery replace slideshow src attr


【解决方案1】:

我会这样做:

var imgcounter = 1;

$("#slide img").click(function(e){
    if(imgcounter < 4){
        imgcounter++;
    }else{
        imgcounter = 1;
    }
    $(this).attr("src", "images/"+imgcounter+".jpg");
});

无论如何,它将处理程序添加到#slide 内的每个img,因此不需要each() 函数,它看起来更干净。 此外,删除了对$(this).attr() 的冗余调用。

【讨论】:

  • 哇,完美运行,代码如此简单!除了我不认为“e”应该在函数()中?谢谢!!
  • e 是自动传递给处理程序的事件对象。如果你真的想要,你可以使用它来操纵事件。但在这种情况下,你是对的,它没有提供任何附加值。
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 2012-11-16
  • 2011-11-19
  • 2019-04-27
  • 1970-01-01
  • 2011-08-31
  • 2012-01-12
  • 1970-01-01
相关资源
最近更新 更多