【问题标题】:jquery toggle change image regarding statusjquery切换关于状态的更改图像
【发布时间】:2013-05-10 12:20:16
【问题描述】:

我正在使用 jquery 切换来隐藏一些内容,如果他/她想看到它,用户可以“展开”这些内容。这是它的一个jsFiddle:

http://jsfiddle.net/yjs2P/

使用此代码:

$.noConflict();
function toggleDiv(divId) {
   jQuery("#"+divId).toggle($);
}

如您所见,第一个元素已用“关闭”图像(红色)打开,另外两个元素已用“打开”图像(橙色)“关闭”。

现在我想实现,如果用户点击其中一张图片,所有切换元素都会关闭,点击相关的元素会打开。当元素打开时,图像应更改为其他状态,因此如果它关闭(橙色),图像应更改为打开(红色),反之亦然。

谁能给我关于这个问题的任何提示?

提前干杯!

【问题讨论】:

    标签: jquery toggle


    【解决方案1】:

    好的,怎么样 - 首先让我们对您的 html 进行一些更改。

    让我们不要使用 id,而是进入按类名引用的心态。因此,对于每个内容 div,我添加了一个 news-content

    ...
    <div class="news-content" id="myContent">
    ...
    <div class="news-content" id="myContent2">
    ...
    <div class="news-content" id="myContent3">
    ...
    

    接下来让我们从超链接的 href 属性中删除点击处理程序(我们稍后将使用 jQuery 添加一个处理程序)

    <a class="toggle" href="#">
    

    删除了所有的 CSS 并确保新闻内容默认隐藏

    .news-content {
        display: none;
    }
    

    jQuery

    有了这些更改,让我们为超链接编写一个单击处理程序,以便它执行切换。注意:我使用 slideUpslideDown 而不是 toggle

    Click here for the fiddle

    $(document).ready(function () { 
        $('a.toggle').click(function () {
    
            // select out the elements for the clicked item
            var $this = $(this),
                $root = $this.closest('.news-text'),
                $content = $root.find('.news-content'),
                $toggleImage = $this.find('img');
    
            // collapse all items except the clicked one
            $('.news-text').each(function () {
                var $itemRoot = $(this);
                if ($itemRoot == $root) return; // ignore the current
                var $itemContent = $itemRoot.find('.news-content');
                if ($itemContent.is(':hidden')) return; // ignore hidden items
    
                // collapse and set img
                $itemContent.slideUp(); 
                $itemRoot.find('.toggle > img').attr('src', 'http://www.70hundert.de/images/toggle-open.jpg');
            });
    
            // for the current clicked item either show or hide
            if ($content.is(':visible')) {
                $content.slideUp();
                $toggleImage.attr('src', 'http://www.70hundert.de/images/toggle-open.jpg');
            } else {
                $content.slideDown();
                $toggleImage.attr('src', 'http://www.70hundert.de/images/toggle-close.jpg');
            }
    
            // stop postback
            return false;
        });
    });
    

    更新 - 新版本的 JQuery 处理程序

    Click here for the fiddle

    $('a.toggle').click(function () {
    
        var openImgUrl = 'http://www.70hundert.de/images/toggle-open.jpg',
            closeImgUrl = 'http://www.70hundert.de/images/toggle-close.jpg';
    
        var $newsItem = $(this).closest('.news-text'),
            $newsContent = $newsItem.find('.news-content'),
            isContentVisible = ($newsContent.is(':visible'));
    
        // slide up all shown news-items - but its expected that only one is visible at a time
        $('.news-text').find('.news-content').slideUp(function () { 
            // on animation callback change the img
            $('.news-text').find('.toggle > img').attr('src', openImgUrl);
        });
    
        if (!isContentVisible) { // if the new-item was hidden when clicked, then show it!
            $newsContent.slideDown(function () {
                // on animation callback change the img
                $newsItem.find('.toggle > img').attr('src', closeImgUrl);
            });
        }
    
        return false; // stop postback
    });
    

    【讨论】:

    • 嗨,克里斯!感谢您的解决方案!我试图在我的网站中实现它,但不幸的是,由于 a-link 中的“href="#"" 网站得到了 a) 重新加载(我不想要它!)和 b) 它改变了 url所以我进入了起始页......
    • javascript 更新 - 确保点击处理程序返回 false 以停止回发
    • 非常感谢克里斯!那是为我做的!非常感谢您的帮助!
    • 喜欢这个!谢谢你:)
    • @henrywright 查看处理程序的更新版本 - 更优雅的版本?
    【解决方案2】:

    试试这个:

    function toggleDiv(divId) {
        jQuery('[id^=myContent]').not("#" + divId).hide()
        jQuery("#" + divId).toggle($);
        var $img = jQuery("#" + divId).next('p').find('img');
        var src = $img.attr('src');
        $img.attr('src', (src.indexOf('close') > -1) ? src.replace('close', 'open') : src.replace('open', 'close'));
    }
    

    DEMO HERE

    【讨论】:

    • 嗨帕拉什!这几乎就是我想要实现的目标!关于你的演示,你可以看到如果我点击第三张图片,第一张图片保持接近(红色),如果我现在点击第二张图片也是如此......图像保持红色并且应该变为橙色......
    • 再次,几乎;) 我打开你的 Fiddle-DEMO,然后我点击第二张图片顶部打开元素,图片变为红色(正确!)。现在我再次单击第二张图像以关闭此元素,图像保持红色。其他元素也有同样的问题,如果我点击图片后立即打开和关闭,图片会一直保持红色...很抱歉再次打扰您,但我不知道如何解决这最后一件事...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多