Making YUI ButtonGroups behave
I like YUI Buttons. Amongst other niceties they allow you to have reliable cross-browser, cross platform custom-rendered form widgets like checkboxes and radio buttons -- while keeping all the accessibility concerns in check. One of the functionalities it has is to create "ButtonGroups", i.e. a bunch of button controls that behave as a traditional radio-button group. All nice and good, except that it has one obnoxious behaviour: it forces all your radio buttons inside a common container -- which might not be what you had in mind. I like my radio buttons where I put them, thank you...
So, quick fix coming up:
var radioGroup = new YAHOO.widget.ButtonGroup({ container: aDivSomewhereItDoesntMatterWhere });
var radioButtons = anArrayOfPlainNormalRadioButtons;
for (var i = 0, len = radioButtons.length; i < len; ++i) {
var nodeIndex = getNodeIndex(radioButtons[i]),
parentNode = radioButtons[i].parentNode,
radioButton = new YAHOO.widget.Button(radioButtons[i]);
// This will put the button somewhere silly
radioGroup.addButton(radioButton);
// Move the button back where it was
parentNode.insertBefore(radioButton.get("element"), parentNode.childNodes[nodeIndex]);
}
So, it's more verbose than just using the simple "new YAHOO.widget.ButtonGroup(radioButtonContainer)" syntax that does everything for you -- if you are willing to have the radio buttons where YUI put them. Also... what's that "getNodeIndex()" function?, I hear you ask. Just a simple utility off my toolbox; it gets the index of a node within all the nodes with the same parent:
var nodeIndex = function(element) {
for (var index = 0, el = element; el = el.previousSibling; ++index);
return index;
}
Hope that's helpful...