I just came up with a solution so simple, yet so stupid, that I had to share it.
The scenario is this: my client has some third-party JavaScript to inject a form into a page. I’ve been writing some of my own CSS to style the forms, including some crafty use of :nth-of-type(2n)
and :nth-of-type(2n-1)
to apply styles conditionally to adjacent fields in a two-up layout. (These are just sequential <div>
tags, and I have to work with what I’ve got.) Specifically, I’m adding some right margin on the “left” element, and no right margin on the “right” element.
I noticed an instance where my margins were flipped for two fields, and when inspecting the code, I discovered why: the client has set up their form with a hidden field tucked in there before the “left” element. That’s throwing off the value for 2n
in my CSS. I was going to contact them and ask them to update their form to put the hidden element at the end, but I realized this is a problem that is likely to recur, so I should just write in a workaround. (Yeah, yeah. But it’s the lesser of two evils.)
Fortunately, the site is already using jQuery, so a fix was super simple. I’m leaving the CSS class names here as they are in the actual site, but you may need to change them to suit your particular form.
jQuery('.form_container .form_page .form_question.hidden').each(function() {
jQuery(this).appendTo(jQuery(this).parent());
});
Since the hidden field has the .hidden
CSS class, it’s really easy to use the jQuery .appendTo()
method to just take all of the hidden fields and shove them to the end of the container element. I used the parent and ancestor CSS classes in my jQuery selector just to be sure I’m isolating this action to these particular forms. Then of course I have to tell the page when to execute this functionality, which is ideally on the load
event:
jQuery(window).on('load', function() { /* Code goes here */ });
It works!