Skip to content

Instantly share code, notes, and snippets.

@ova2
Created September 27, 2012 11:40
Show Gist options
  • Save ova2/3793573 to your computer and use it in GitHub Desktop.
Save ova2/3793573 to your computer and use it in GitHub Desktop.
Solution to "DataTable performance problem in IE with checkboxes / radio buttons"
bindCheckboxEvents: function() {
...
SOLUTION TO THE PERFORMANCE PROBLEM
//keyboard support
$(checkboxSelector).off('focus.ui-chkbox blur.ui-chkbox keydown.ui-chkbox keyup.ui-chkbox')
.on('focus.ui-chkbox', function() {
var input = $(this),
box = input.parent().next();
if(input.prop('checked')) {
box.removeClass('ui-state-active');
}
box.addClass('ui-state-focus');
})
.on('blur.ui-chkbox', function() {
var input = $(this),
box = input.parent().next();
if(input.prop('checked')) {
box.addClass('ui-state-active');
}
box.removeClass('ui-state-focus');
})
.on('keydown.ui-chkbox', function(e) {
var keyCode = $.ui.keyCode;
if(e.which == keyCode.SPACE) {
e.preventDefault();
}
})
.on('keyup.ui-chkbox', function(e) {
var keyCode = $.ui.keyCode;
if(e.which == keyCode.SPACE) {
var input = $(this),
box = input.parent().next();
if(input.prop('checked')) {
_self.unselectRowWithCheckbox(box);
}
else {
_self.selectRowWithCheckbox(box);
}
e.preventDefault();
}
});
},
@ova2
Copy link
Author

ova2 commented Sep 27, 2012

======== Using with .find() as example for custom events binding

...

var chkboxSelector = tableId + ' tbody.ui-datatable-data tr.ui-widget-content:not(.ui-datatable-empty-message) > td.ui-selection-column .ui-chkbox';

// register click callbacks on checkboxes
$(chkboxSelector).find('.ui-chkbox-box').off("click.ui-chkbox-ext").on("click.ui-chkbox-ext", function () {
    var checkbox = $(this);

    if (!checkbox.hasClass('ui-state-disabled')) {
        var checked = checkbox.hasClass('ui-state-active');

        if (checked) {
            unselectRowWithCheckboxExt(...);
        } else {
            selectRowWithCheckboxExt(...);
        }
    }
});

$(chkboxSelector).find('input').off("keyup.ui-chkbox-ext").on("keyup.ui-chkbox-ext", function (e) {
    var keyCode = $.ui.keyCode;

    if (e.which == keyCode.SPACE) {
        var input = $(this);
        var checkbox = input.parent().next();

        if (input.prop('checked')) {
            unselectRowWithCheckboxExt(...);
        } else {
            selectRowWithCheckboxExt(...);
        }

        e.preventDefault();
    }
});

======== Tip to using without .off(). It's working well with AJAX updates and avoid multiple binding

var checkAllTogglerSelector = tableId + ' table thead th.ui-selection-column .ui-chkbox.ui-chkbox-all .ui-chkbox-box';

// bound custom onclick on "all toggler" checkbox only once
$(checkAllTogglerSelector).not('.click-bound').addClass('click-bound').on('click', function() {
    ...
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment