【问题标题】:jquery rollover confusionjQuery翻转混乱
【发布时间】:2010-12-12 19:25:54
【问题描述】:

试图让我的翻转更改 src 翻转。这工作正常,虽然有一个错误。单击缩略图后,src 有时可能包含错误的 src(即使鼠标悬停,鼠标悬停状态仍然存在)。 .要查找错误,请单击一些缩略图并将鼠标悬停在一些缩略图上,您应该会看到已单击的鼠标悬停 src 仍然存在。演示不再可用,抱歉!

jQuery -

function image_gallery (){

if ($('ul.thumbs').length > 0) {
    $('.gallery').each(function(){
        $('ul.thumbs li img:gt(0)').addClass('unselected');
        $('ul.thumbs li img:eq(0)').addClass('selected');

        function mouse_overs () {
            var unselected = $('li img.unselected');
            unselected.hover(function(){
                    var thumb = $(this);
                    thumb.attr('src',thumb.attr('src')
                           .replace(/([^.]*\d)\.(.*)/, "$1r.$2"));
                }, function(){
                      var thumb = $(this);
                  thumb.each(function(){
                      $(this).attr('src',$(this)
                           .attr('src').replace('r.jpg','.jpg'));
                  });
            });
        };
        mouse_overs();
        var img_main = $(this).find('img.main:first');
        $(this).find('ul.thumbs img').each(function(){
            $(this).click(function(){
                var thumb =  $(this);
                var src = thumb.attr('src');
                if ( src.indexOf('r.jpg') == -1) {
                     $(this).attr('src',thumb.attr('src')
                                .replace(/([^.]*)\.(.*)/, "$1r.$2"));
                }
                var selected = $('ul.thumbs li img.selected');

                // previous img remove r.jpg
                selected.attr('src',selected.attr('src')
                                    .replace('r.jpg','.jpg'));
                  selected.removeClass('selected');
                selected.addClass('unselected');

                //current thumb add class "selected", remove "unselected"
                thumb.addClass('selected');
                thumb.removeClass('unselected');
                mouse_overs();
                var rel = $(this).parent('a').attr('rel');
                img_main.fadeOut(500, function(){
                    img_main.attr('src', rel);
                    img_main.fadeIn('slow');
                });

                thumb.mouseout(function(){
                    var src = $(this).attr('src');
                    if ( src.indexOf('r.jpg') == -1) {
                        $(this).attr('src',thumb.attr('src')
                                      .replace(/([^.]*)\.(.*)/, "$1r.$2"));
                    }
                    else return false;
                });
            });
});
    });
   }
}

HTML:

<div class="gallery">
<img class="main" src="images/gallery/yes-campaign/NL1.jpg"/>
<ul class="thumbs">
        <li><a rel="images/gallery/yes-campaign/NL1.jpg"><img src="images/thumbs/yes-campaign/NL-1r.jpg"/></a></li>
        <li><a rel="images/gallery/yes-campaign/NL2.jpg"><img src="images/thumbs/yes-campaign/NL-2.jpg"/></a></li>
        <li><a rel="images/gallery/yes-campaign/NL3.jpg"><img src="images/thumbs/yes-campaign/NL-3.jpg"/></a></li>
        <li><a rel="images/gallery/yes-campaign/NL4.jpg"><img src="images/thumbs/yes-campaign/NL-4.jpg"/></a></li>
    </ul>
</div>

此 HTML 在整个页面中重复多次。翻转状态为 NL1r.jpg、NL2r.jpg 等。图像被组织在文件夹中,因此所有图像文件名使用相同的命名约定。

【问题讨论】:

    标签: jquery mouseover


    【解决方案1】:

    我可以建议以下代码而不是您的代码吗?

    $(function gallery (){
    
            var transparency = .5;
            var selectedClassName = 'selected';
            var imageFadeSpeed = 'fast';
    
            $('.gallery').each(function(i, gallery) {
                var $gallery = $(gallery);
    
                var $main = $gallery.find('.main');
    
                $gallery.find('.thumbs a')
    
                    // image preloader
                    .each(function(){
                        var tempImg = $('<img src="'+ $(this).attr('rel') +'" width="'+ $main.width() +'" />').appendTo('body').hide();
                    })
    
                    .hover(function() {
                        if ($(this).is('.'+selectedClassName))
                            return;
                        $(this).children().css('opacity', 1);
                    }, function() {
                        if ($(this).is('.'+selectedClassName))
                            return;
                        $(this).children().css('opacity', transparency);
                    })
    
                    .click(function(ev) {
                        ev.preventDefault();
    
                        var self = $(this);
    
                        $main.fadeOut(imageFadeSpeed, function() {                      
                            var tempImg = $('<img src="'+ self.attr('rel') +'" width="'+ $main.width() +'" />').appendTo('body');
                            var newHeight = tempImg.height();
                            tempImg.remove();
    
                            $(this)
                                .attr('src', self.attr('rel'))
                                .height(newHeight);
    
                            $(this).fadeIn(imageFadeSpeed);
                        });
    
                        $gallery.find('.'+selectedClassName)
                            .removeClass(selectedClassName)
                            .children()
                            .css('opacity', transparency);
    
                        self
                            .addClass(selectedClassName)
                            .children()
                            .css('opacity', 1);
                        return;
                    })
    
                    .children()
                    .css('opacity', transparency)
                    .end()
    
                    .filter(':first')
                    .addClass(selectedClassName)
                    .children()
                    .css('opacity', 1);
            });
    });
    

    我已将悬停时的图像交换替换为降低服务器负载的不透明度更改,但您可以轻松地将这些替换为 src 交换。您只需要使用以“r.jpg”结尾的图像。

    我还提取了一些配置变量,以便您可以尝试一下。

    【讨论】:

    • 目前您的图像上有浮动左侧 CSS 位置,请确保将“overflow:hidden”添加到它们周围的 LI 元素。
    • 谢谢 - 确保它们是可见的 - 但不幸的是不透明度变化没有发生。
    • 我已根据您的情况更改了代码。不透明度现在应用于 img 元素而不是锚标签,由于您的 CSS,这可能是必需的。另一个尝试的选择是查看 LI 和 A 元素的 CSS。我通常会浮动 LI 元素,然后给 A 标签“block”的显示属性。
    • 好的,我已按照您的建议使用 CSS,并将新代码添加到演示中,但单击后我仍然遇到悬停问题。难道你只是喜欢 javascript :)
    • 好的,我已经更改了代码,这次它的编写方式与您的函数文件完全相同。我已经在 webkit 中使用您的文件副本对其进行了测试,它对我来说可以正常工作。
    【解决方案2】:

    虽然我认为马特在脚本方面做得非常出色(为此 +1),但我仍然建议使用 GalleryView plugin (Demo here)。


    我还在学习,所以我的假设可能不正确,如果我错了,请随时纠正我。但是在再次查看您的代码后,我想添加这些 cmets:

    • 您的 mouse_overs 函数似乎修复了最初的“未选择”类。最好的解决方法是使用 jQuery 的“live”事件处理程序。这样,当您将选定的类更改为未选定的类时,反之亦然,实时事件将更新(注意:当前版本的 jquery 不支持悬停,因此您必须使用 mouseover 和 mouseout)。似乎悬停的鼠标悬停部分也被调用了 3 次,这也可能是相关的。
    • 替换函数中使用的正则表达式不能正常工作。单击缩略图切换图像后,我注意到一旦鼠标移出(来自 thumb.mouseout 函数),URL 就开始将 r 添加到静态单词的末尾......大约 10 次鼠标移出后,我最终得到这个 URL “http://staticrrrrrrrrrr.yourdomain.com/someimage.jpg”。我不太了解我的正则表达式,因此无法帮助您解决此问题。
    • 与其修改 URL,不如按照 Matt 的建议并使用 opacity 更容易,但如果您想使用不同的图像,我会将 URL 存储在 img 的 rel 属性中,然后以这种方式切换,那么 URL 出现问题的可能性就会降低。

    【讨论】:

    • 虽然我的代码可能只是一般的 jquery 和 js 的皮毛,但通过手工编码,我离目标只有一个错误,在这个过程中我学到了很多东西。从MS的例子中,我学到了更多的财富。如果我使用插件,我个人将一无所获,我会选择脚本的缩小版本,并花时间尝试将其破解为客户的需求,这不会让人觉得有效率,而是具有破坏性,我会试图超越插件的功能,我敢肯定插件很牛,虽然在这种情况下,它看起来对我的小要求来说有点过分了。
    • 我很感激你想学习,我自己从这里有经验的人那里学到了很多东西,我只是建议让你的生活更轻松:P...我确实更深入地研究了你的代码并在我上面的帖子中添加了一些 cmets。顺便说一句,Firebug 是你的朋友 :)
    • fudgey - 感谢您的详细分析 - 我怀疑“live”可以帮助我解决这个问题。请从此页面中删除该网址。一旦我的情况得到解决,我就会把它从我的帖子中删除。谢谢。
    • 另外 - 你在哪里证明“当前版本的 jquery 不支持悬停”?这里没有提到 - docs.jquery.com/Events/hover
    • 有关于 jQuery 'live' 页面的信息......它没有具体说明不支持悬停,但它不在支持的事件列表中:click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup 和我'已经尝试使用实时悬停但没有成功 - 如果您必须使用悬停,您可能会使用 livequery 插件(但不要引用我的话)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多