【问题标题】:Toggle between two classes in jQuery在 jQuery 中的两个类之间切换
【发布时间】:2009-10-29 15:29:19
【问题描述】:

我正在尝试修改jQuery UI portlets 的图标。而不是有一个加号来最小化和一个减号来扩展,我想切换它们。

我只取得了有限的成功,第一次单击减号时它会翻转为加号,但加号永远不会翻转为减号。对此的任何帮助将不胜感激。

这是一个示例 HTML:

<script src="scripts/jquery-1.3.2.js" type="text/javascript" ></script>
<script src="scripts/ui/ui.core.js" type="text/javascript"></script>
<script src="scripts/ui/ui.sortable.js" type="text/javascript"></script>

<div class="column">
    <div class="portlet">
        <div class="portlet-header">Links</div>
        <div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
    </div>
</div>

这是我为 jQuery 设计的:

<script type="text/javascript">
    $(function() {
        $(".column").sortable({
            connectWith: '.column'
        });

        $(".portlet").addClass("ui-widget ui-widget-content ui-helper-clearfix ui-corner-all")
        .find(".portlet-header")
            .addClass("ui-widget-header ui-corner-all")
            .prepend('<span class="ui-icon ui-icon-minusthick"></span>')
            .prepend('<span class="ui-icon ui-icon-closethick"></span>')
            .end()
        .find(".portlet-content");

        $(".portlet-header .ui-icon-minusthick").click(function() {
            $(this).removeClass("ui-icon-minusthick");
            $(this).addClass("ui-icon-plusthick");
            $(this).parents(".portlet:first").find(".portlet-content").toggle();
        });

        $(".portlet-header .ui-icon-plusthick").click(function() {
            $(this).removeClass("ui-icon-plusthick");
            $(this).addClass("ui-icon-minusthick");
            $(this).parents(".portlet:first").find(".portlet-content").toggle();
        });

        $(".portlet-header .ui-icon-closethick").click(function() {
            $(this).parents(".portlet:first").toggle();
        });

        $(".column").disableSelection();
    });
</script>


编辑:这是来自 jQuery UI 演示站点的原始 javascript:
<script type="text/javascript">
$(function() {
    $(".column").sortable({
        connectWith: '.column'
    });

    $(".portlet").addClass("ui-widget ui-widget-content ui-helper-clearfix ui-corner-all")
        .find(".portlet-header")
            .addClass("ui-widget-header ui-corner-all")
            .prepend('<span class="ui-icon ui-icon-plusthick"></span>')
            .end()
        .find(".portlet-content");

    $(".portlet-header .ui-icon").click(function() {
        $(this).toggleClass("ui-icon-minusthick");
        $(this).parents(".portlet:first").find(".portlet-content").toggle();
    });

    $(".column").disableSelection();
});
</script>

我不确定他们是如何正确切换正负的。

【问题讨论】:

  • 我认为 jQuery 演示有效,因为当添加 ui-icon-minusthick 时,它会覆盖 ui-icon-plusthick 属性。当你第一次点击它时,它应该有两个类。
  • 你有一个更简单的方法! stackoverflow.com/questions/7002039/…
  • 请更新最佳答案。

标签: jquery class toggle


【解决方案1】:

怎么样

$(YOUR_ELEMENT).live("EVENT_NAME", function() {
    $(".portlet-header").toggleClass("ui-icon-plus").toggleClass("ui-icon-minus");
});

更短

$(YOUR_ELEMENT).live("EVENT_NAME", function() {
    $(".portlet-header").toggleClass("ui-icon-plus ui-icon-minus");
});

编辑

从 jQuery 1.7 开始,.live() 方法已被弃用。使用.on() 附加事件处理程序。 旧版本 jQuery 的用户应该使用.delegate() 而不是.live()


jQuery API reference

【讨论】:

  • 我一直在尝试弄清楚如何在 2 个课程之间切换近一天,感谢上帝,我找到了你的答案,它在几秒钟内解决了我的问题!我有一个用于布局的网格视图切换器,当用户单击它时,它必须添加 1 个类并删除另一个或删除当前并替换,因此它始终是 2 个类中的 1 个。我不知道你可以像这样将它们链接在一起,所以感谢分享
【解决方案2】:

你可以试试下面的代码

$(this).toggleClass('ui-icon-plusthick ui-icon-minusthick');

【讨论】:

  • 我相信这是最好的答案。
  • @Pardoner 奇怪的是这行得通。然而,jquery 文档指出应用$('.tumble').toggleClass('bounce spin')&lt;div class="tumble bounce spin"&gt;&lt;div class="tumble"&gt; 之间交替。但它似乎在:&lt;div class="tumble bounce"&gt;&lt;div class="tumble spin"&gt; 之间切换
  • 我没有看到这种行为...jsfiddle.net/4kDaR/30 不同之处在于,在 OP 请求中,被切换的元素从其中一个类开始。切换命令将其关闭,第二个打开,因为它以前是关闭的。从而使两者交替。要获得您最后描述的行为,请参见此处...jsfiddle.net/4kDaR/34
【解决方案3】:

这可能是因为当您绑定这些函数时,$(".portlet-header .ui-icon-plusthick") 没有结果。它没有找到它。您可以在添加“ui-icon-plusthick”类后将此绑定添加到 $(".portlet-header .ui-icon-minusthick").click(function() { ... 。

编辑: 替代解决方案可能是:

$(".portlet-header .ui-icon-minusthick").toggle(function() {
        $(this).removeClass("ui-icon-minusthick");
        $(this).addClass("ui-icon-plusthick");
        $(this).parents(".portlet:first").find(".portlet-content").toggle();
    }, function() {
        $(this).removeClass("ui-icon-plusthick");
        $(this).addClass("ui-icon-minusthick");
        $(this).parents(".portlet:first").find(".portlet-content").toggle();
    });

所以第一次点击是第一个功能,第二次点击是第二个功能。

【讨论】:

  • 我明白你的意思,但我无法让它正常工作。我在 addClass('ui-icon-plusthick') 上添加了 .click(function() {... 但这似乎使它不稳定。你会能举例说明你的意思吗?
  • 甜蜜!谢谢,这已经让我挂了一段时间了。顺便说一句,您的示例需要是 $(".portlet-header .ui-icon-minusthick").toggle(...
  • .toggle() (event) 现已弃用api.jquery.com/toggle-event 参考stackoverflow.com/questions/14301935/… 如果您仍想使用此选项,这里有一个非常漂亮且干净的选项stackoverflow.com/questions/14301935/…
【解决方案4】:

我编写了这个 jQuery 函数,而不是插件,用于循环访问任意数量的类。两个动作就像一个切换。只需将您的 CSV 类名放入元素的数据类中。然后用 $(selector).cycleClass() 循环它

www.PluginExamples.com/draggable查看它的使用情况@选择可拖动轴

(function($){
    $.fn.cycleClass = function(){
        if( !$(this).data("aClasses") ){
            var classes = $(this).attr("data-classes").split(",");
            $(this).data("aClasses", classes);
            $(this).data("classes", classes.join(" "));
            $(this).data("class", classes.length);
        }
        $(this).data("class",($(this).data("class")+1) % $(this).data("aClasses").length);
        $(this).removeClass($(this).data("classes"))
            .addClass( $(this).data("aClasses")[$(this).data("class")] );
        return $(this);
    }
});

【讨论】:

    【解决方案5】:

    您为什么不直接修改 ui-icon-plusthick CSS 类来显示减号图像而不是加号图像,而不是执行所有这些 Javascript?

    【讨论】:

    • 您能举例说明如何在课堂上的两个图像之间切换吗?
    • 其实,仔细想想,那是行不通的。我不希望网站上没有最小化的其他 portlet 来改变他们的形象。
    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多