I have a simple add attribute function:
$(".list-toggle").click(function() {
$(".list-sort").attr('colspan', 6);
});
My question is: how can I turn this into a toggle, so colspan="6"
is removed from the element on the next click?
jQuery toggle() Method The toggle() method toggles between hide() and show() for the selected elements. This method checks the selected elements for visibility. show() is run if an element is hidden.
attr() deprecated/removed for use with "checked" and "disabled" properties. Many sites now use various means to update their version of jQuery to a later version than 1.4, the version in Drupal 7. jQuery deprecated (version 1.6) and removed (version 1.9) the use of .
If you're feeling fancy:
$('.list-sort').attr('colspan', function(index, attr){
return attr == 6 ? null : 6;
});
Working Fiddle
ES6 Syntax (2021):
$('.list-sort').attr('colspan', (_, attr) => attr == 6 ? null : 6));
$('.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.
For readonly/disabled and other attributes with true/false values
$(':submit').attr('disabled', function(_, attr){ return !attr});
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);
});
This would be a good place to use a closure:
(function() {
var toggled = false;
$(".list-toggle").click(function() {
toggled = !toggled;
$(".list-sort").attr("colspan", toggled ? 6 : null);
});
})();
The toggled
variable will only exist inside of the scope defined, and can be used to store the state of the toggle from one click event to the next.
$(".list-toggle").click(function() {
$(this).hasAttr('colspan') ?
$(this).removeAttr('colspan') : $(this).attr('colspan', 6);
});
$(".list-toggle").click(function() {
$(this).attr('colspan') ?
$(this).removeAttr('colspan') : $(this).attr('colspan', 6);
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With