how to toggle attr() in jquery

前端 未结 10 1937
独厮守ぢ
独厮守ぢ 2021-01-30 15:50

I have a simple add attribute function:

$(\".list-toggle\").click(function() {
    $(\".list-sort\").attr(\'colspan\', 6);
});

My question is:

相关标签:
10条回答
  • 2021-01-30 16:19
    $('.list-toggle').click(function() {
        var $listSort = $('.list-sort');
        if ($listSort.attr('colspan')) {
            $listSort.removeAttr('colspan');
        } else {
            $listSort.attr('colspan', 6);
        }
    });
    

    Here's a working fiddle example.

    See the answer by @RienNeVaPlus below for a more elegant solution.

    0 讨论(0)
  • 2021-01-30 16:23

    I know this is old and answered but I recently had to implement this and decided to make 2 simple jQuery plugins that might help for those interested

    usage:

    // 1
    $('.container').toggleAttr('aria-hidden', "true");
    // 2
    $('.container').toggleAttrVal('aria-hidden', "true", "false");
    

    1 - Toggles the entire attribute regardless if the original value doesn't match the one you provided.

    2 - Toggles the value of the attribute between the 2 provided values.

     // jquery toggle whole attribute
      $.fn.toggleAttr = function(attr, val) {
        var test = $(this).attr(attr);
        if ( test ) { 
          // if attrib exists with ANY value, still remove it
          $(this).removeAttr(attr);
        } else {
          $(this).attr(attr, val);
        }
        return this;
      };
    
      // jquery toggle just the attribute value
      $.fn.toggleAttrVal = function(attr, val1, val2) {
        var test = $(this).attr(attr);
        if ( test === val1) {
          $(this).attr(attr, val2);
          return this;
        }
        if ( test === val2) {
          $(this).attr(attr, val1);
          return this;
        }
        // default to val1 if neither
        $(this).attr(attr, val1);
        return this;
      };
    

    This is how you would use it in the original example:

    $(".list-toggle").click(function() {
        $(".list-sort").toggleAttr('colspan', 6);
    });
    
    0 讨论(0)
  • 2021-01-30 16:25

    For readonly/disabled and other attributes with true/false values

    $(':submit').attr('disabled', function(_, attr){ return !attr});
    
    0 讨论(0)
  • 2021-01-30 16:25

    This answer is counting that the second parameter is useless when calling removeAttr! (as it was when this answer was posted) Do not use this otherwise!

    Can't beat RienNeVaPlus's clean answer, but it does the job as well, it's basically a more compressed way to do the ternary operation:

    $('.list-sort')[$('.list-sort').hasAttr('colspan') ? 
        'removeAttr' : 'attr']('colspan', 6);
    

    an extra variable can be used in these cases, when you need to use the reference more than once:

    var $listSort = $('.list-sort'); 
    $listSort[$listSort.hasAttr('colspan') ? 'removeAttr' : 'attr']('colspan', 6);
    
    0 讨论(0)
  • 2021-01-30 16:26
    $(".list-toggle").click(function() {
        $(this).hasAttr('colspan') ? 
            $(this).removeAttr('colspan') : $(this).attr('colspan', 6);
    });
    
    0 讨论(0)
  • 2021-01-30 16:31
    $(".list-toggle").click(function() {
        $(this).attr('colspan') ? 
        $(this).removeAttr('colspan') : $(this).attr('colspan', 6);
    });
    
    0 讨论(0)
提交回复
热议问题