Using the same callback technique, I decided to overlay a div instead of add the disabled attribute to the step element. This works well when the backdrop is turned on and the element is not an input field (i.e. the disabled property takes no effect).
First the css for the overlay:
.tour-step-backdrop-parent {
position: absolute;
z-index: 1100;
}
And the code (updated to account for backdrop padding and absolute positioned step element):
onShown: function(tour) {
var step = tour._options.steps[tour._current];
/// Overlay a div on the tour contents to prevent clicking
// Remove any existing overlay divs - accounting for shown event being called on window resize
$(step.element).siblings('.tour-step-backdrop-parent').remove();
// Create overlay div
var disabledOverlay = $('<div class="tour-step-backdrop-parent"></div>');
// Insert overlay div before step element in DOM
$(step.element).before(disabledOverlay);
// Account for step's backdrop padding if any (double it since it surrounds the element)
var padding = (step.backdropPadding || 0) * 2;
// Set size of the overlay div to the step element's size and account for rounding by adding 1 pixel
disabledOverlay.outerHeight(stepElement.outerHeight() + padding + 1).outerWidth(stepElement.outerWidth() + padding + 1);
// Set position based on element's position and adjust for backdrop padding
var offset = stepElement.offset();console.log(offset);
offset.top = offset.top - (step.backdropPadding || 0);
offset.left = offset.left - (step.backdropPadding || 0);
disabledOverlay.offset(offset);
},
onHidden: function(tour) {
var step = tour._options.steps[tour._current];
// Remove overlay div
$(step.element).siblings('.tour-step-backdrop-parent').remove();
}